Java_总结二十四(反射机制)

一、反射是什么

  --Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性

  --使用反射,可以在运行时对类Class、构造方法Constructor、普通方法Method、字段(属性)Field进行操作

 

二、实例化Class类对象的三种方法

  User.java

 

package reflection;

public class User {

    private String name;
    public int age;
    static int weight;
    public User(String name, int age,int weight) {
        super();
        this.name = name;
        this.age = age;
        this.weight = weight;
    }
    public User() {
        super();
    }
    @Override
    public String toString() {
        return "User [name=" + name + ", age=" + age + "]";
    }
    public void eat() {
        System.out.println("吃");
    }

    public void drink(String type) {
        System.out.println("喝" + type);
    }

    public String sleep() {
        System.out.println("睡");
        return "呵呵";
    }

    private void play() {
        System.out.println("玩");
    }

    public static void hehe() {
        System.out.println("heheheheh");
    }
    
}

 

 

package reflection;

public class GetClass {

    public static void main(String[] args) {
        Class class1 = null;
        Class class2 = null;
        Class class3 = null;
        try {
            class1 = Class.forName("reflection.User");//第一种方法,也是最常用的方法
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        class2 = new User().getClass();//第二种方法
        
        class3 = User.class;//第三种方法
        
        System.out.println(class1.getName());
        System.out.println(class2.getName());
        System.out.println(class3.getName());
    }
}

 

三、通过有参构造实例化对象、无参构造实例化对象

package reflection;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class Construction {
    public static void main(String[] args) {
        Class class1 = null;
        try {
            class1 = Class.forName("reflection.User");
            //通过有参构造实例化对象
            Constructor constructor = class1.getConstructor(String.class,int.class);//得到有参构造方法
            User user = (User) constructor.newInstance("zhang",43);
            System.out.println(user);
            
            //通过无参构造实例化对象
            //第一种方式
            Constructor constructor2 = class1.getConstructor(null);//得到无参构造方法
            User user2 = (User) constructor2.newInstance(null);
            //第二种方式
            User user3 = (User) class1.newInstance();
            System.out.println(user2);
            System.out.println(user3);
            
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
    }
}

 

四、反射取得方法

package reflection;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Methods {

    public static void main(String[] args) {

        try {
            Class class1 = Class.forName("reflection.User");
            // 得到构造方法
            Constructor constructor = class1.getConstructor(null);
            Object object = constructor.newInstance(null);

            Method[] methods = class1.getMethods();// 得到本类和父类的非私有的方法

            Method[] methods2 = class1.getDeclaredMethods();// 得到本类中声明的所有的方法(包括私有)
            
            // 得到 无参  无返回值的 方法并且调用
            Method method = class1.getMethod("eat", null);
            //              调用方法的对象    实际参数
            method.invoke(object, null);// 是哪个方法被调用
            
            // 调用  有参数 无返回值的方法
            Method method2 = class1.getMethod("drink", String.class);
            method2.invoke(object, "水");
            
            // 有返回值的
            Method method3 = class1.getMethod("sleep", null);
            Object  object2 = method3.invoke(object, null);// invoke方法的返回值就是调用的方法的返回值
            System.out.println(object2);
            
            // 得到静态的方法
            Method method4 = class1.getMethod("hehe", null);
            method4.invoke(null, null);// 静态方法不需要传递对象  直接写null
            
            
            // 私有的   私有的方法 必须用 getDeclaredMethod 才能得到
            Method method5 = class1.getDeclaredMethod("play", null);
            method5.setAccessible(true);// 私有方法默认没有权限调用,必须单独设定调用权限
            method5.invoke(object, null);
            
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

 

五、反射取得属性(字段)

package reflection;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
/**
 * 注解
 * 
 * 
 * 反射: 优点: 可以帮助在没有类的情况下创建对象和调用属性和方法
 *               使用注解
 *         缺点: 可以使用私有的属性和方法,破坏了代码块的安全性
 * 
 *
 */
public class Fields {

    public static void main(String[] args) {
        try {
            Class class1 = Class.forName("reflection.User");
            // 得到构造方法
            try {
                Constructor constructor = class1.getConstructor(null);
                Object object = constructor.newInstance(null);
                
                
                Field[] fields = class1.getFields();
                Field[] fields2 =  class1.getDeclaredFields();
                
                Field field = class1.getField("age");// 得到指定的属性对象
                field.set(object, 5);// 给属性赋值
                Object object2 = field.get(object);// 得到属性值
                System.out.println(object2);
                
                // 调用静态的属性
                Field field2 = class1.getDeclaredField("weight");
                field2.set(null, 10);
                Object object3 = field2.get(null);
                System.out.println(object3);
                
                // 私有的属性
                Field  field3 = class1.getDeclaredField("name");
                field3.setAccessible(true);//设置可以访问私有属性的权限
                field3.set(object, "小花");
                Object object4 =     field3.get(object);
                System.out.println(object4);
                
            } catch (InstantiationException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (SecurityException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (NoSuchFieldException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

 

posted @ 2017-05-23 13:04  Java_皮卡丘漏电  阅读(105)  评论(0编辑  收藏  举报