当前位置:  技术问答>java相关

java某方法在写代码时,如何得知运行时将要调用它的方法的名称及其所在类名?(很难的,请赐教,送您100)

    来源: 互联网  发布时间:2015-04-12

    本文导语:  java某方法在写代码时,如何得知运行时将要调用它的方法的名称及其所在类名? 说明:     某方法doReturn()将会被很多很多方法所调用。而它的实现内容却与调用它的方法的名称有关,也就是说,调用者不同,实...

java某方法在写代码时,如何得知运行时将要调用它的方法的名称及其所在类名?

说明:
    某方法doReturn()将会被很多很多方法所调用。而它的实现内容却与调用它的方法的名称有关,也就是说,调用者不同,实现的功能不同。因此,如何在写代码时就知道调用者的信息?????

|
枚举所有方法名称恐怕是最糟糕的设计了,因为你要"硬编码(hard code)",并且繁琐,容易出错。我觉得"不同功能的实现"放在调用者(caller)一方,在被调用者(callee)这边调用调用者的实现。

解决方案简单描述:
1、所有将要调用某方法(doReturn())的类实现接口DiffenrentReturnable。
2、此接口有一方法(whatDifferent()),也就是不同的实现,所有的调用者要实现。
3、你现在要做的就是定义doReturn()接受一个参数,类型就是刚才定义的接口,伪码如下:
void doReturn(DifferentReturnable df) {
    df.whatDifferent; //让调用者实现不同的功能
    。。。
}

|
import java.io.*;
import java.util.*;
import java.lang.reflect.*;

public class MakeTodayClass {
  Date today = new Date();
  String todayMillis = Long.toString(today.getTime());
  String todayClass = "z_" + todayMillis;
  String todaySource = todayClass + ".java";
  
  public static void main (String args[]){
    MakeTodayClass mtc = new MakeTodayClass();
    mtc.createIt();
    if (mtc.compileIt()) {
      System.out.println("Running " + mtc.todayClass + ":nn");
      mtc.runIt();
      }
    else
      System.out.println(mtc.todaySource + " is bad.");
    }

  public void createIt() {
    try {
      FileWriter aWriter = new FileWriter(todaySource, true);
      //aWriter.write("package com;");
      aWriter.write("public class "+ todayClass + "{");
      aWriter.write(" public void doit() {");
      aWriter.write(" System.out.println(""+todayMillis+"");");
      aWriter.write(" }}n");
      aWriter.flush();      
      aWriter.close();
      }
    catch(Exception e){
      e.printStackTrace();
      }
    }
  
  public boolean compileIt() {
    String [] source = {"-d","d:/",new String(todaySource) };
    ByteArrayOutputStream baos= new ByteArrayOutputStream();

    //new sun.tools.javac.Main(baos,source[0]).compile(source);    
    // if using JDK >= 1.3 then use
    System.out.println(com.sun.tools.javac.Main.compile(source));    
    System.out.println("================"+new String(baos.toByteArray()));
    return (baos.toString().indexOf("error")==-1);
    }
    
  public void runIt() {
    try {
      Class params[] = {};
      Object paramsObj[] = {};
      Class thisClass = Class.forName(todayClass);
      Object iClass = thisClass.newInstance();
      Method thisMethod = thisClass.getDeclaredMethod("doit", params);
      thisMethod.invoke(iClass, paramsObj);
      }
    catch (Exception e) {
      e.printStackTrace();
      }
    }
}

|
SecurityManager有一个getClassContext()方法,如果只需要类名,可以考虑用这个,但你得自己extend一个SecurityManager,因为这个方法是protected。另外一个方法就是生成一个Exception,然后调printStackTrace(...),打印到字符串中,然后解析字符串,得到所有的类和方法。注意打印格式可能随JVM的不同而改变。

|
既然你运行的时候才能知道有什么类来调用你的方法,那么, bdsc 的方法我认为是最好的了,否则,即使你能够得到调用你方法的类名,你也需要在doReturn()方法中一一列举你的处理方法,如果突然要增加一个新的类来调用你的方法呢?怎么办,难到开发者还要通知你修改你的方法?与其这样,不如声明你的接口,在调用者的类中实现(可以让调用者继承这个接口或采用其它设计模式)。

|
换个思路吧,带参数调用这个方法,如:
doReturn(int invokeParameter)
方法里面根据不同的参数值做不同的事

|
多多利用OO的特性就可以搞定!

用instanceof也可以,但不推荐。

用反射也能实现,但反而麻烦了。

|
关于这类问题的解决方法,可以参考设计模式中的模板方法模式和Command模式

|
猫哥,我想如果能实现这个功能的话,答案一定在Java虚拟机规范中。我想,因为在进行函数调用时是使用的堆栈,那么可以通过堆栈找出相关的信息的。马上要吃饭了,下午再来看规范吧!

|
“但如何能做到一次编码,就能在不同jvm上都能解析得到类和方法名呢?”这个只能试验了,呵呵,sun的JVM间应该差别不大。总的来说,Java API没有这方面的功能,所以只能凑合了,要么就得用C了。

|
如果你发现自己漩入了一个几乎无法解决的漩涡,

那么就说明你最初的设计就出了问题!!

任何程序高手也不能让别人什么也不动就可以在自己这边搞定一切!!!

|
同意bdsc(),用接口比较合适!

|
isinstanceof

|
public class XX
{
    static void doReturn( Object obj )
    {
        if( obj instanceof XYZ )
            ....
        ....
    }
}

很恶心得办法

|
和这个主题有关吗?

|
doReturn(Object b)
{
  b.getClass().getName()//??可以吗?

}

    
 
 

您可能感兴趣的文章:

  • java命名空间java.lang类runtime的类成员方法: runfinalization定义及介绍
  • Java中如何通过方法名动态调用方法?
  • java命名空间java.awt.im类inputcontext的类成员方法: getinputmethodcontrolobject定义及介绍
  • <%@ page import="java.lang.Math"%>后用round(float a)方法,怎么报找不到round方法?
  • java命名空间java.sql类types的类成员方法: java_object定义及介绍
  • java初学--在java中有个native本地方法 说是能嵌入c 不知道具体?
  • java命名空间java.lang类system的类成员方法: runfinalization定义及介绍
  • 在JAVA中只有一种派生子类的方法吗?我记得在C++ 中有3种派生方法的!
  • java命名空间java.lang类stacktraceelement的类成员方法: isnativemethod定义及介绍
  • java根据方法名称取得反射方法的参数类型示例
  • java命名空间java.lang类stacktraceelement的类成员方法: getmethodname定义及介绍
  • 请问java.sql包中 preparedStatement 对象的setString(int parameterIndex,java.lang.String x)方法怎么用?
  • java命名空间java.awt.im.spi接口inputmethod的类成员方法: dispose定义及介绍
  • java.util类对象的DATE方法为何不能用? <%=new java.util.date()%>,在页面中是这样写的,服务器用的是Resin.
  • java命名空间java.net类httpurlconnection的类成员方法: getrequestmethod定义及介绍
  • 有没有一种工具可以让java自动调出类的方法、成员?就像Delphi一样,写完Edit1.系统会跳出一些TEdit的属性、方法。
  • java命名空间java.security类policyspi的类成员方法: enginerefresh定义及介绍
  • 各位高手知道在JAVA中如何用一个名称创建一个对象实例,并调用其方法,注意:在编写代码时并不知要创建的对象的类名,也并不知方法名
  • java命名空间java.awt.im.spi接口inputmethod的类成员方法: getcontrolobject定义及介绍
  • java 与 C++ 实现后绑定的方法
  • java命名空间java.security类policy的类成员方法: refresh定义及介绍
  • 谁能告诉我哪里能找到java包内部类及方法使用介绍
  • 小问题:有关JAVA文件名和类名之间的关系?在线讨论,马上结帖!!
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 有没有Java的DirectDraw类库包,敬请赐教!
  • 各位好,有一个关于java日期的问题请教,请不吝赐教。
  • 请问java web start和jre分别是什么意思啊?!(请路过的前辈赐教!!!)
  • 一个关于JAVA多平台的实现问题,请高手赐教!
  • 用java swing JTable做一个属性编辑器遇到的问题,请高手赐教!急,急!!
  • 请java 高手赐教,在线等待,高分!
  • 请赐教:关于Java于Access数据库操作的问题
  • ### 现在JAVA可应用在哪几个前沿技术,小弟想找个毕业设计的题目,请赐教 ###
  • 关于JAVA的学习,从DELPHI而来,望不吝赐教!谢谢!
  • java问题001,各位高手请赐教
  • 在java里有关编码和解码的问题:比如对中文编码成BASE64或quoted-printable或者是其他的,应该用什么类什么方法?请赐教!!
  • 一个JAVA的问题,希望高手赐教,急!!!
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: imageflavor定义及介绍
  • 我想学JAVA ,是买THINK IN JAVA 还是JAVA2核心技术:卷1 好???
  • java命名空间java.lang.management类managementfactory的类成员方法: getcompilationmxbean定义及介绍
  • 请问Java高手,Java的优势在那里??,Java主要适合于开发哪类应用程序
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getlibrarypath定义及介绍
  • 如何将java.util.Date转化为java.sql.Date?数据库中Date类型对应于java的哪个Date呢
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getstarttime定义及介绍
  • 谁有电子版的《Java编程思想第二版(Thinking in java second)》和《Java2编程详解(special edition java2)》?得到给分
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: stringflavor定义及介绍
  • 本人想学java,请问java程序员的待遇如何,和java主要有几个比较强的方向
  • java命名空间java.security类keystore的类成员方法: getdefaulttype定义及介绍
  • 我对JAVA一窍不通,可惜别人却给我一个Java的project,要我做一个安装程序,请问哪里有JAVA INSTALLER下载,而且我要不要安装java的sdk才能完成此项任务?
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getclasspath定义及介绍
  • 新年第一天,让我们讨论一下未来一年JAVA的发展趋势! 个人认为,JAVA将主要朝ERP和JAVA手机方面发展!
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: javaserializedobjectmimetype定义及介绍
  • 我想学Java,但不知道Java的实用的开发工具有那些,Java主要用在哪些方面,EJB到底是什么东西??
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: javafilelistflavor定义及介绍
  • redhat7.3下,java程序打印中文直接用java命令执行正常,用crontab执行java命令为乱码
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getvmname定义及介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    WEB前端 iis7站长之家