您的位置:首页 > 职场人生

黑马程序员_JAVA反射学习笔记

2014-03-13 15:50 375 查看
------- android培训java培训、期待与您交流! ----------
平常一般的应用开发中很少用。多出现在框架的开发中。

从效率上来讲,反射的效率是比较低的。

学习反射的目的是为了,在后期学习通用框架的时候,有用。

反射中的概念:

1、代码中xxx.class为类的字节码,在代码运行过程中,主要存储在方法区中。

2、做反射的时候,主要用Class的forName()方法。

3、反射就是把Java类中的各种成分映射成相应的java类。

简单的反射代码实现:

0、代码中用到的被反射的类示例:

class ReflectPoint {
//私有的成员
private int x;
//公有的成员
public int y;

/**
* 带参的构造函数
* @param x
* @param y
*/
public ReflectPoint(int x, int y) {
this.x=x;
this.y=y;
}

/**
* x属性访问器
* @return
*/
public int getX() {
return x;
}
}


1、Constructor类

代表构造方法

参考代码:

/**
* 用反射获取构造器创建实例代码
* @throws Exception
*/
private static void constructorTest() throws Exception {
//获取入参为指定类名的字节码
Class<?> clazz = Class.forName("java.lang.String");
//获取参数的构造器
Constructor<?> cst = clazz.getConstructor(StringBuffer.class);
//通过构造器获取对象
Object obj = cst.newInstance(new StringBuffer("hello"));
//获取根据反射构造器获取到的对象
System.out.println(obj);
//获取Object类对应的字节码
System.out.println(obj.getClass());
}


2、Field类

表示成员变量

获取可见的(公有的成员变量)

参考代码:

/**
* 获取对象的公有访问成员
* @throws NoSuchFieldException
* @throws IllegalAccessException
*/
private static void getPublicField() throws NoSuchFieldException,
IllegalAccessException {
//新建对象
ReflectPoint rp = new ReflectPoint(3, 5);
//通过实例获取字节码
Class<?> clazz = rp.getClass();
//通过字节码获取y属性(y属性为共有)
Field fieldY = clazz.getField("y");
//将对象做为入参,获取对象中y属性的值。
Object obj = fieldY.get(rp);
System.out.println(obj);
}


获取不可见的(非公有的成员变量)

参考代码:

/**
* 获取对象的非公有访问权限属性
* @throws NoSuchFieldException
* @throws IllegalAccessException
*/
private static void getPrivateField() throws NoSuchFieldException,
IllegalAccessException {
//新建对象
ReflectPoint rp = new ReflectPoint(3, 5);
//通过实例获取字节码
Class<?> clazz = rp.getClass();
//通过字节码获取x属性(x属性为私有)
Field fieldX = clazz.getDeclaredField("x");
//暴力反射非可见变量,用于让不可见变量的值变为可见
fieldX.setAccessible(true);
//将对象最为入参,获取对象中x属性的值。
Object obj = fieldX.get(rp);
System.out.println(obj);
}


3、Method类

获取类的方法

参考代码:

private static void getMethodGetX() throws NoSuchMethodException,
IllegalAccessException, InvocationTargetException {
//新建对象
ReflectPoint rp = new ReflectPoint(3, 5);
//通过实例获取字节码
Class<?> clazz = rp.getClass();
//通过字节码获取x属性(x属性为私有)
Method methodGetX = clazz.getMethod("getX", null);
//执行Method方法
Object obj = methodGetX.invoke(rp, null);
System.out.println(obj);
}


*、补充:

静态方法调用时,第一个参数为null,eg:

methodCharAt.invoke(null, 1);


main()函数的调用,eg:

Method method = TestMain.class.getMethod("main", String[].class);
method.invoke(null, new Object[]{new String[]{"1","2","3"}});
method.invoke(null, (Object)new String[]{"1","2","3"});


------- android培训java培训、期待与您交流! ----------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: