黑马程序员技术交流社区
标题:
反射总结
[打印本页]
作者:
段郎
时间:
2014-4-18 12:13
标题:
反射总结
Class是java中所有类的类
反射就是把java类的各成分映射成对应的java类。反射用多了会影响性能
类的实例机制:每一个类原本都是在硬盘上面的,运行时每一个类被加载到内存中,加载进来的都是字节码,也就是class文件,再用这也字节码为一个个该类的对象实例化。通过 对象名称.class 可以得到该对象的类的字节码。实例化Class对象时是用已存在内的字节码实例的。
Class类对象的实例化方式,因为得到字节码的方式多种所以实例化的方式多种:
1、Class c1=对象名称.getClass
2、Class c2=Class.forName("带包名的路径名称")
3、Class c3=类名称.class
每一个类只会有一个字节码,也就是说通过不同的方式实例化该类对应的Class类,得到的对象都是同一个
Class类常用方法
isPrimitive//判断是否是基本数据类型
isArray//判断是否是数组数据类型
Construct getConstruct()//得到构造方法
Construct
Field
3、Method(代表某个类中的一个成员方法)
得到类中的某一个方法:Method methodchartAt=Class.forName("带包名的路径名称").getMethod(方法名,参数列表)
调用方法:
a.通常方法:对象名称.chartAt(1)
b.反射方式:methodchartAt .invoke(对象名,参数列表)
4、Constructor
Constructor constructors[] Class.forName("类完整路径名").getConstructors();//得到该类的所有构造方法,放在一个数组织中
也可以通过getConstructor(参数列表1)得到指定构造方法。
String str=constructor1.newInstance(参数列表2) 实例化,注意:参数列表1和参数列表2要一样的,不然运行时会报错
5、Field
Point pint=new Point("x",“y”);
Field fieldy=class.forname("路径").getFiled(“y”)//得到了指定类的字段
filedy.get(point)//得到point对象的y属性
需要注意的是field.get()并不能得到y,还需要把该对象point穿进去。
6、通过内省的方式得到 javabean 中的get set 方法
PropertyDescriptor pd=new PropertyDescriptor (要得到get、set方法的字段,得到哪个对象的get、set方法)
Method methodGetX=pd.getReadMethod();//得到了get方法
Object retval=methodGetX.invoke(对象名)//得到了x的值
作者:
官珺伟
时间:
2014-4-28 07:23
反射指定类中的方法:
//获取类中所有的方法。
public static void method_1() throws Exception {
Class clazz = Class.forName("cn.itcast.bean.Person");
Method[] methods = clazz.getMethods();//获取的是该类中的公有方法和父类中的公有方法。
methods = clazz.getDeclaredMethods();//获取本类中的方法,包含私有方法。
for(Method method : methods) { System.out.println(method);
}
}
//获取指定方法;
public static void method_2() throws Exception {
Class clazz = Class.forName("cn.itcast.bean.Person");
//获取指定名称的方法。
Method method = clazz.getMethod("show", int.class,String.class);
//想要运行指定方法,当然是方法对象最清楚,为了让方法运行,调用方法对象的invoke方法即可,但是方法运行必须要明确所属的对象和具体的实际参数。
Object obj = clazz.newInstance();
method.invoke(obj, 39,"hehehe");//执行一个方法 }
//想要运行私有方法。
public static void method_3() throws Exception {
Class clazz = Class.forName("cn.itcast.bean.Person");
//想要获取私有方法。必须用getDeclearMethod();
Method method = clazz.getDeclaredMethod("method", null);
// 私有方法不能直接访问,因为权限不够。非要访问,可以通过暴力的方式。
method.setAccessible(true);//一般很少用,因为私有就是隐藏起来,所以尽量不要访问。 }
//反射静态方法。
public static void method_4() throws Exception {
Class clazz = Class.forName("cn.itcast.bean.Person");
Method method = clazz.getMethod("function",null);
method.invoke(null,null);
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2