如何动态地给一个类加入一些方法和属性?
比如一个类:
class Test {
}
我想在别的类里使 Test 类具有 public int getX (), public void setX(x)方法,应该怎么做呢
------解决方案--------------------修改.class文件
或者写个反编译代码出来,反编译》添加方法》编译,您看可以么?
------解决方案--------------------我没试过,但直觉上觉得这样不可以
因为不知什么时候你给一个接口加上个方法那就麻烦了
------解决方案--------------------应该不可以。必须实现指定,可能N年后的人工智能能做到吧
------解决方案--------------------用JAVA程序来写JAVA程序,再编译,不算动态生成么?
------解决方案--------------------你可以直接输出到.java文件里啊
------解决方案--------------------当然不可以!如果可以的话,安全性就出大问题了,那个时候JAVA就要被淘汰了!!
但有例外,除非你是高手中的高手,懂得破解字节码!impossible mission...
------解决方案--------------------不知道你是不是这个意思:
回调:
package org.battwofame.hellojava.test.test1;
class CallBack {
public void callBack() {
System.out.println( "aaaaaaaaaaaaaaaaaa ");
}
}
interface ICallBack {
public void callBack(CallBack cb);
}
public class TestCallBack implements ICallBack {
public void callBack(CallBack cb) {
cb.callBack();
}
public static void main(String[] args) {
TestCallBack tcb = new TestCallBack();
tcb.callBack(new CallBack());
}
}
------解决方案--------------------使用继承Test的办法,在子类中扩展方法
这样既规范,又解决问题~~
------解决方案--------------------public aspect ExtendClassRecipe
{
private int MyClass.newvariable = 20; //给类MyClass动态增加一个属性
public int MyClass.bar(String name) //给类MyClass动态增加一个方法
{
System.out.println( "In bar(String name), name: "+name);
return this.newVariable;
}
}
需要用AspectJ支持,有Eclipse的插件可下载。
------解决方案--------------------当然可以了,网上有很多这方面的应用,比如spring就是用了动态字节码生成技术。
看看这些开源工具吧
http://www.open-open.com/54.htm
把静态的java语言像动态语言一样用起来!!!!