黑马程序员_JAVA反射学习笔记
2014-03-13 15:50
375 查看
------- android培训、java培训、期待与您交流! ----------
平常一般的应用开发中很少用。多出现在框架的开发中。
从效率上来讲,反射的效率是比较低的。
学习反射的目的是为了,在后期学习通用框架的时候,有用。
反射中的概念:
1、代码中xxx.class为类的字节码,在代码运行过程中,主要存储在方法区中。
2、做反射的时候,主要用Class的forName()方法。
3、反射就是把Java类中的各种成分映射成相应的java类。
简单的反射代码实现:
0、代码中用到的被反射的类示例:
1、Constructor类
代表构造方法
参考代码:
2、Field类
表示成员变量
获取可见的(公有的成员变量)
参考代码:
获取不可见的(非公有的成员变量)
参考代码:
3、Method类
获取类的方法
参考代码:
*、补充:
静态方法调用时,第一个参数为null,eg:
main()函数的调用,eg:
------- 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培训、期待与您交流! ----------
相关文章推荐
- 【黑马程序员】 学习笔记 - Java新技术 - 反射
- 黑马程序员--JAVA反射学习笔记2
- 黑马程序员--Java基础加强学习笔记之Class类、反射(Reflect)
- 黑马程序员java学习笔记——正则表达式、反射
- 黑马程序员 java学习笔记 Day11:反射机制详解
- 黑马程序员--Java基础学习笔记【单例设计模式、网络编程、反射】
- 黑马程序员——java 反射学习笔记
- 黑马程序员—Java基础加强学习笔记之枚举&反射
- 黑马程序员——Java学习笔记之13——“反射”总结
- 黑马程序员——JAVA学习笔记——反射机制(下)
- 黑马程序员—Java学习笔记之必须掌握的反射技术
- 黑马程序员-java学习笔记-反射基础类Class
- 黑马程序员 java学习笔记 Day10:反射
- 黑马程序员-Java的反射学习笔记
- 黑马程序员--java反射学习笔记
- 黑马程序员——JAVA学习笔记——反射机制(上)
- 黑马程序员 java学习笔记——反射
- 黑马程序员--学习笔记--Java反射
- 黑马程序员_java基础学习笔记11_反射
- 黑马程序员——java学习笔记--反射机制