比如说现在我有这样的一个类package com.test1;import java.lang.reflect.Method;public class Test {
private Integer id;
public static void main(String[] args)throws Exception{
Class cla = Class.forName("com.test1.Test");
try {
/*下面的这行代码将会抛出以下异常:
  Exception in thread "main" java.lang.NoSuchMethodException: com.test1.Test.getId()
  at java.lang.Class.getDeclaredMethod(Class.java:1937)
  at com.test1.Test.main(Test.java:9) */
Method method = cla.getDeclaredMethod("getId",new Class[]{});
} catch (NoSuchMethodException e) {
/* Method method = cla.getDeclaredMethod("getId",new Class[]{});这行代码的
 * 异常将在这里被捕获(原因是找不到指定的方法),在这个catch里面我就想动态的给cla创建一个getId()
 * 的这样一个方法,可是在这 我就不知道该怎么写了  望各位赐教?  */
//像我说的这种需要  ,现在的jdk能做到吗?

e.printStackTrace();
}
}
}
在上面的这个类中,id属性没有相应的getter方法!我想要的结果就是:程序在运行中可以动态的给Test类加上getter方法,
强调:只是在运行的时候,让Test类可以使用getter方法,并不是要在Test.java这个文件里面加上相应的getter方法

解决方案 »

  1.   

    可以的话都不用写javabean了.如果给field赋值,用Class的getField试试.
      

  2.   

    使用cglib不知道能不能做到,你可以尝试一下。
      

  3.   

    我没这么做过,但是做过动态生成类,就是根据用户填写的信息实时生成动态的类。是在把需要生成的类写到一个String里然后用forName来生成。楼主这种没见过,我想你对概念的理解有误。Class.getDeclaredMethod(String,Class[])是获得一个已经在这个类中定义了的方法,而不是建立一个不存在的方法。同理,getField也是一样,只能获得已经定义的field而不是凭空建立一个。我想你应该从动态建立类的方向入手,再用Class.forName把这个类实例化来得到你向执行的方法.
      

  4.   

    如果你是想得到id的值的话,从API看,这个id必须是public才能从getField得到,否则getField会到这个类继承的父类里找public的同名field,直到循环到最顶级父类,如果还没找到就返回一个NoSuchFieldException异常
      

  5.   

    至少我所知道的程序设计语言里还没有楼主说的那种功能:给类动态添加方法
    请问楼主,方法是什么?那是一段子程序的入口,进入子程序之后不是简单的一个 setter 方法就完事了,可能还要做很复杂的逻辑运算,还有可能再调用子程序。试问如果支持动态添加方法,那么简单的加上一个方法名和参数列表之后,方法内部的程序代码怎么办,也要动态产生吗?
      

  6.   

    可以动态使用方法,从多个方法中动态选择一个方法,或者动态的使用一个接口的实现方法。但前提是这些方法在编译时已经存在。
    楼主想要的这个结果是无法实现的,即使能实现sun也会出补丁将他卡掉,因为这是违反数据封装原则的,是bug。
      

  7.   

    想法是好的,但我是第一次看到这种“实现”,根据API上说的和平时的积累,这样应该是不行的楼主可以换种方法实现自己的需求不能给解决,帮你顶下
      

  8.   

    不可能啊
    一个class被JVM加载后,在内存中的模型基本已经定下来了,不可能再改了,楼上有人说用cgiLib,要知道cgiLib其实是给你动态做了一个子类。
      

  9.   

    要用getDeclaredField,而且要设置一下权限 setAccessible(true);
    getField只能访问public成员
      

  10.   


    貌似动态增加类成员的方法在编译语言中几乎没有,解释语言中倒是常见,例如PYTHON,用setattr(obj, member)就可以做到,obj是一个class或对象,member可以是属性也可以是方法,很方便灵活,但是有的时候看代码就觉得挺乱了。看代码,明明没有定义的方法,在别的地方居然有调用,找半天才找到是动态加入的……
      

  11.   

    动态写一个###.java文件,然后调用编译器动态编译成###.class文件,反射调用之。