您的位置:首页 > 编程语言 > Java开发

Java再学习-反射机制

2016-05-08 19:12 369 查看
首先说到反射,大家肯定不会陌生,如果不知道反射,相信那些市面上常用的主流框架就不会出现了。废话不说,上主题!

Java反射机制

运行时

判断任意一个对象所属的类

构造任意一个类的对象

判断任意一个类所具有的成员变量和方法

调用一个对象的方法

注意点:运行时,而不是编译时

首先概念性的东西,小编就不细说了,想了解的直接问度娘吧,直接上干货吧。

通过反射来进行方法调用的具体步骤:
1.首先要获取Class对象(手段比较多,例如通过forname手段和InvokeTester.class手段)
2.如果想调用方法获取Method对象(),如果想操作字段就要获取Field[]对象

上面这两点一会儿下面的代码中都会体现的,大家不要着急。

小编这里想说两点,关于调用类的构造方法的实现,当然构造方法分成带参数和不带参数的,先来一段不带参数

Class c = Test.class;
c.newInstance();


另一种写法:

Constructor con = c.getConstructor(new Class[]{});
con.newInstance(new Object[]{});

带参数的构造方法调用

Class c = Test.class;
Constructor con = c.getConstructor(new Class[]{double.class,int.class});
con.newInstance(new Object[]{1.2,3})//类型一致

再次声明。反射是各大框架的基础,通过反射我们可以获取类,类的方法,类的变量等等,这样才会有了现在的Struts,spring等等。

最后来看一段代码:

package cn.tgb.reflection;

public class PrivateTest {

private String name = "hello";

public String getName(){
return this.name;
}
}

问:如果将变量name的值,换成world呢?

当然,通过反射的方式了,来看下一段代码吧。

package cn.tgb.reflection;

import java.lang.reflect.Field;

public class ReflectionTest {

public static void main(String[] args) throws Exception {

PrivateTest pt = new PrivateTest();

Class<?> clazz = PrivateTest.class;

Field field = clazz.getDeclaredField("name");

field.setAccessible(true);//压制java的访问控制检查。

field.set(pt, "world");

System.out.println(field.get(pt));

}
}


大家可以运行一下上面的代码,看看输出的结构是否是world。最后通过反射,获取类中的字段名,然后通过set的方式就可以修改字段的名啦。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: