java反射的问题,关于invoke和instance。

初学反射,看得很迷糊。假设已经有一个test1类我用test1params1=null;params1=(test1)Class.forName("asdf.test1"... 初学反射,看得很迷糊。
假设已经有一个test1类
我用test1 params1=null;params1=(test1) Class.forName("asdf.test1").newInstance();
这一句就已经可以使用test1里面的公有方法和参数了。
那么,invoke方法又有什么用呢?
如果可以的话请详细的说说反射吧,可以追加分数。
展开
 我来答
悉心且深远灬萨摩A
2013-04-01 · TA获得超过636个赞
知道小有建树答主
回答量:294
采纳率:0%
帮助的人:310万
展开全部
我用test1 params1=null;params1=(test1) Class.forName("asdf.test1").newInstance();
这一句就已经可以使用test1里面的公有方法和参数了。
的确,没错的。你拿到了Class对象,就相当于拿到了test1的一个副本样,能拿到他的属性和方法。但是你拿到了后该干什么的?你不去调用方法吗?不去给属性设置值吗?你这个就相当于我定义了一个类,里面有属性和方法,但是我外部程序不去调用它。invoke就是调用方法的。
invoke的中文含义就是调用哎。自己百度下invoke的含义吧。

反射的核心就是要拿到该类的字节码对象---》Class对象。(真的是核心,不要看到就这几个字)
都拿到了该类的字节码了,那么该类的什么都能拿到了。比如:属性,方法,构造器,泛型,注解等等。反射使得java具有非常活跃的应用。你能想到的框架,如SSH,无一不利用了反射机制。以及一些设计模式,如动态代理(基于jdk)等,IoC、DI、AOP等等,底层都用到了反射。

至于真么用反射,我就不说了,网上多得是,随便百度一下就是一大把。
等你学完SSH,理解一些常用的设计模式,看看他们的底层实现,反射就通了。
匿名用户
2013-04-01
展开全部
Class clazz = Class.forName("test1");
Method method = clazz.getDeclaredMethod("getName").//忘记方法名了,自己查下 Class 类就知道)

Object instance = clazz.newInstance();

Object value = Class.invoke(instance, method);

这个就是 invoke, Class, Method, 与 insance 的 4 个关系,自己好好理解一下。

上面几行,转换为正常的调用过程,如下:

Test1 test = new Test1();
Object value = test1.getName();
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友98d517e7b
2013-04-01 · 超过10用户采纳过TA的回答
知道答主
回答量:59
采纳率:100%
帮助的人:29.7万
展开全部
Java反射基本的东西

1,Clas类相关 直接用类路径生成实例
Class cls=Class.forName("ClassName"); Object obj = Class.newInstance(); Constructor []cs=Class.getDeclaredConstructors();Constructor cs=Class.getConstructor(new Class[2]{Integer.TYPE,Integer.TYPE}); Field[] fs=Class.getDeclaredFields();Field f=Class.getField("d"); Method[] methList=Class.getMethods();Method method=c.getMethod("add",new Class[2]{Integer.TYPE,Integer.TYPE});

2,Constructor类相关 获取构造方法
Constructor.getName();Constructor.getDeclaringClass();Class []ps=Constructor.getParameterTypes(); Class []es=Constructor.getExceptionTypes(); Object rtnObj=Constructor.newInstance(new Object[2]{new Integer(37),new Integer(26)});

3,Field类相关 获取字段数据Field.getName();Field.getDeclaringClass();Field.getType();Modifier.toString(Fiel.dgetModifiers());Field.setDouble(new ModifyField(),12.34);

4,Method类相关基本于Constructor相同,另不同如下 根据方法名称直接调用方法
Method.getReturnType();Object returnObj=Method.invoke(new PerformMethod(),new Object[2]{new Integer(37),new Integer(26)});
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友845f74e61
推荐于2016-08-27 · TA获得超过6929个赞
知道大有可为答主
回答量:4050
采纳率:50%
帮助的人:1636万
展开全部
很多东西都是相对来说的。
比如
public class Test{
private int id = 0 ;
public void fun(){

}
}

Test params1=null;params1=(Test) Class.forName("Test").newInstance();

这个 相当于 Test params1 = new Test();

Class.forName("Test").invoke("fun",null);
相当于 params1.fun();

这些在这里,你看不出任何的意义。因为你都显示的转换了
params1.fun();的调用比invoke更直接。

但是,如果这些信息都是通过配置文件读入的话又作怎么样?

给你一个假设的情况。
那就是做了一个接口,有很多的实现类。
你通过配置文件读入了类信息,及要调用的方法信息,那这时,你不可能将每一个类转换为
具体的类型,只能转换类接口类型 ,然后用invoke来调用方法。因为有这个方法不一定是接品方法。

说这些你有可能不是很明白。那就先记下。
这些都是在用到的时候,才会显出用处。单独的一个例子,你看不出来它的实用性。
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
程云
2021-05-14
知道答主
回答量:54
采纳率:0%
帮助的人:2.5万
展开全部

Java反射-属性操作

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式