java学习——反射机制
Posted 渣渣的博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java学习——反射机制相关的知识,希望对你有一定的参考价值。
/*
* JAVA反射机制是在运行状态中,对于任意一个类 (class文件),都能够知道这个类的所有属性和方法;
* 对于任意一个对象,都能够调用它的任意一个方法和属性;
* 这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
*
* 动态获取类中信息,就是java反射 。
* 可以理解为对类的解剖。
*
* 要想要对字节码文件进行解剖,必须要有字节码文件对象.
* 如何获取字节码文件对象呢?
*
*/
1. 通过Class clazz =Class.forName()找寻名称类文件,并加载进内存,产生Class对象
2. 通过Object obj = clazz.newInstance();产生该类的对象。
3. 就可以获取本类的属性和方法了。
1 public class ReflectDemo { 2 3 /** 4 * @param args 5 * @throws ClassNotFoundException 6 */ 7 public static void main(String[] args) throws ClassNotFoundException { 8 9 getClassObject_3(); 10 11 } 12 /* 13 * 获取字节码对象的方式: 14 * 1,Object类中的getClass()方法的。 15 * 想要用这种方式,必须要明确具体的类,并创建对象。 16 * 麻烦 . 17 * 18 */ 19 public static void getClassObject_1(){ 20 21 Person p = new Person(); 22 Class clazz = p.getClass(); 23 24 Person p1 = new Person(); 25 Class clazz1 = p1.getClass(); 26 27 System.out.println(clazz==clazz1); 28 } 29 /* 30 * 方式二: 31 * 2,任何数据类型都具备一个静态的属性.class来获取其对应的Class对象。 32 * 相对简单,但是还是要明确用到类中的静态成员。 33 * 还是不够扩展。 34 * 35 */ 36 public static void getClassObject_2() { 37 38 Class clazz = Person.class; 39 40 Class clazz1 = Person.class; 41 System.out.println(clazz==clazz1); 42 } 43 /* 44 * 方式三: 45 * 只要通过给定的类的 字符串名称就可以获取该类,更为扩展。 46 * 可是用Class类中的方法完成。 47 * 该方法就是forName. 48 * 这种方式只要有名称即可,更为方便,扩展性更强。 49 */ 50 51 public static void getClassObject_3() throws ClassNotFoundException { 52 53 String className = "cn.itcast.bean.Person"; 54 55 Class clazz = Class.forName(className); 56 57 System.out.println(clazz); 58 } 59 }
1 public static void createNewObject_2() throws Exception { 2 3 // cn.itcast.bean.Person p = new cn.itcast.bean.Person("小强",39); 4 5 /* 6 * 当获取指定名称对应类中的所体现的对象时, 7 * 而该对象初始化不使用空参数构造该怎么办呢? 8 * 既然是通过指定的构造 函数进行对象的初始化, 9 * 所以应该先获取到该构造函数。 通过字节码文件对象即可完成。 10 * 该方法是:getConstructor(paramterTypes); 11 * 12 */ 13 String name = "cn.itcast.bean.Person"; 14 //找寻该名称类文件,并加载进内存,并产生Class对象。 15 Class clazz = Class.forName(name); 16 //获取到了指定的构造函数对 象。 17 Constructor constructor = clazz.getConstructor(String.class,int.class); 18 19 //通过该构造器对象的newInstance方法进行对象的初始化。 20 Object obj = constructor.newInstance("小明",38); 21 22 } 23 24 public static void createNewObject() throws ClassNotFoundException, InstantiationException, IllegalAccessException{ 25 26 //早期:new时候,先根据被new的类的名称找寻该类的字节码文件,并加载进内存, 27 // 并创建该字节码文件对象,并接着创建该字节文件的对应的Person对象. 28 // cn.itcast.bean.Person p = new cn.itcast.bean.Person(); 29 30 //现在: 31 String name = "cn.itcast.bean.Person"; 32 //找寻该名称类文件,并加载进内存,并产生Class对象。 33 Class clazz = Class.forName(name); 34 //如何产生该类的对象呢? 35 Object obj = clazz.newInstance(); 36 }
/* * 获取字节码文件中的字段。 */ 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; }
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(); 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); } }
以上是关于java学习——反射机制的主要内容,如果未能解决你的问题,请参考以下文章