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学习——反射机制的主要内容,如果未能解决你的问题,请参考以下文章

反射机制入门

Java-反射机制学习

反射机制入门

JAVA 学习笔记 - 反射机制

深入理解java的反射机制

Java反射学习:深入学习Java反射机制