黑马程序员----反射机制的原理和应用
2014-07-28 14:17
1311 查看
----------------------
ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
反射简述及三种获取Class对象的方法
----------------------
ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
反射简述及三种获取Class对象的方法
<span style="font-size:18px;">package cn.itcast.reflect.demo; import cn.itcast.bean.Person; /* * JAVA反射机制是在运行状态中,对于任意一个类(class文件),都能够知道这个类的所有属性和方法; * 对于任意一个对象,都能够调用它的任意一个方法和属性; * 这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 * * * 动态获取类中信息,就是java反射。 * 可以理解为对类的解剖。 * * * 要想要对字节码文件进行解剖,必须要有字节码文件对象. * 如何获取字节码文件对象呢? * */ public class ReflectDemo { /** * @paramargs * @throwsClassNotFoundException */ public static void main(String[] args) throws ClassNotFoundException { getClassObject_3(); } /* * 方式三: * 只要通过给定的类的字符串名称就可以获取该类,更为扩展。 * 可是用Class类中的方法完成。 * 该方法就是forName. * 这种方式只要有名称即可,更为方便,扩展性更强。 */ public static void getClassObject_3() throws ClassNotFoundException { String className = "cn.itcast.bean.Person"; Classclazz = Class.forName(className); System.out.println(clazz); } /* * 方式二: * 2,任何数据类型都具备一个静态的属性.class来获取其对应的Class对象。 * 相对简单,但是还是要明确用到类中的静态成员。 * 还是不够扩展。 * */ public static void getClassObject_2() { Classclazz = Person.class; Classclazz1 = Person.class; System.out.println(clazz==clazz1); } /* * 获取字节码对象的方式: * 1,Object类中的getClass()方法的。 * 想要用这种方式,必须要明确具体的类,并创建对象。 * 麻烦. * */ public static void getClassObject_1(){ Person p = newPerson(); Classclazz = p.getClass(); Person p1 = newPerson(); Classclazz1 = p1.getClass(); System.out.println(clazz==clazz1); } } </span>利用反射获取构造函数
package cn.itcast.reflect.demo; import java.io.FileReader; import java.lang.reflect.Constructor; public class ReflectDemo2 { /** * @param args * @throws Exception * @throws InstantiationException * @throws ClassNotFoundException */ public static void main(String[] args) throws ClassNotFoundException, InstantiationException, Exception { createNewObject_2(); } public static void createNewObject_2() throws Exception { //cn.itcast.bean.Person p = new cn.itcast.bean.Person("小强",39); /* * 当获取指定名称对应类中的所体现的对象时, * 而该对象初始化不使用空参数构造该怎么办呢? * 既然是通过指定的构造函数进行对象的初始化, * 所以应该先获取到该构造函数。通过字节码文件对象即可完成。 * 该方法是:getConstructor(paramterTypes); * */ String name = "cn.itcast.bean.Person"; //找寻该名称类文件,并加载进内存,并产生Class对象。 Class clazz = Class.forName(name); //获取到了指定的构造函数对象。 Constructor constructor = clazz.getConstructor(String.class,int.class); //通过该构造器对象的newInstance方法进行对象的初始化。 Object obj = constructor.newInstance("小明",38); } public static void createNewObject() throws ClassNotFoundException, InstantiationException, IllegalAccessException{ //早期:new时候,先根据被new的类的名称找寻该类的字节码文件,并加载进内存, //并创建该字节码文件对象,并接着创建该字节文件的对应的Person对象. //cn.itcast.bean.Person p = new cn.itcast.bean.Person(); //现在: String name = "cn.itcast.bean.Person"; //找寻该名称类文件,并加载进内存,并产生Class对象。 Class clazz = Class.forName(name); //如何产生该类的对象呢? Object obj = clazz.newInstance(); } }利用反射获取字段
package cn.itcast.reflect.demo; import java.lang.reflect.Field; public class ReflectDemo3 { /** * @paramargs * @throwsException */ public static void main(String[] args) throwsException { getFieldDemo(); } /* * 获取字节码文件中的字段。 */ public static void getFieldDemo() throws Exception { Class clazz = Class.forName("cn.itcast.bean.Person"); Field field = null;//clazz.getField("age");//只能获取公有的, field = clazz.getDeclaredField("age");//只获取本类,但包含私有。 //对私有字段的访问取消权限检查。暴力访问。 field.setAccessible(true); Object obj = clazz.newInstance(); field.set(obj, 89); Object o = field.get(obj); System.out.println(o); //cn.itcast.bean.Person p = new cn.itcast.bean.Person(); //p.age = 30; } }利用反射获取Class中的公共函数
package cn.itcast.reflect.demo; import java.lang.reflect.Constructor; import java.lang.reflect.Method; public class ReflectDemo4 { public ReflectDemo4() { } /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { getMethodDemo_3(); } public static void getMethodDemo_3() throws Exception { Class clazz = Class.forName("cn.itcast.bean.Person"); Method method = clazz.getMethod("paramMethod", String.class,int.class); Object obj = clazz.newInstance();308 method.invoke(obj, "小强",89); } public static void getMethodDemo_2() throws Exception { Class clazz = Class.forName("cn.itcast.bean.Person"); Method method = clazz.getMethod("show", null);//获取空参数一般方法。 //Object obj = clazz.newInstance(); Constructor constructor = clazz.getConstructor(String.class,int.class); Object obj = constructor.newInstance("小明",37); method.invoke(obj, null); } /* * 获取指定Class中的所有公共函数。 */ public static void getMethodDemo() 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); } } }
----------------------
ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
相关文章推荐
- 黑马程序员--03.反射--01【反射机制】【反射的应用场景】【Tomcat服务器】
- 黑马程序员—反射的机制及应用1
- 解析Spring IOC原理——工厂模式与反射机制的综合应用
- 解析Spring IOC原理——工厂模式与反射机制的综合应用
- 黑马程序员—反射机制及应用2
- 黑马程序员——反射机制的应用
- 黑马程序员_学习笔记7可变参数的应用及1.5增强for的联合使用以及反射的总结
- 黑马程序员-----反射机制的学习
- 反射机制构建web应用(Demo)
- Java中的异常处理机制的简单原理和应用。
- RAD XE反射机制的应用——只获取父类的方法
- 黑马程序员_反射应用
- 请描述Java中异常处理机制的简单原理和应用,并说明Error与Exception有什么区别?
- java反射全接触(原理,示例和应用)
- 学习:java原理—反射机制
- java基础问题----Java中的异常处理机制的简单原理和应用
- java 反射机制的研究与应用
- [零基础学JAVA]Java SE应用部分-36.反射机制与工厂设计模式 推荐
- 探讨Java代理模式与反射机制的实际应用
- 黑马程序员:反射的应用