Java反射(一)

你。 提交于 2019-12-24 04:26:27
一、反射定义

在运行状态中,对于任何一个类,我们都能够知道这个类有哪些方法和属性。对于任何一个对象,我们都能够对它的方法和属性进行调用。我们把这种动态获取对象信息和调用对象方法的功能称之为反射机制。

二、涉及到概念Class、Constructor、Field、Method
  • Class
    程序运行期间,Java运行时系统为所有对象维护的一个被称为运行时的类型标识。
    获取Class方式三种:
    1)getClass ( )
    2).class
    2)静态方法 forName
public class User {
    private String userName;
    private int age;

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public User() {
        this.userName = "";
        this.age = 1;
    }

    public User(String userName, int age) {
        this.userName = userName;
        this.age = age;
    }
}

public class Main {

    public static void main(String[] args) throws  Exception{
        User user = new User("张三",20);
        Class clz1 = user.getClass();
        Class clz2 = User.class;
        Class clz3 = Class.forName("User");

        System.out.println(clz1 == clz2);
        System.out.println(clz2 == clz3);
    }
}

Class其他方法
1)创建实例, User user2 = (User) clz2.newInstance();
2)获取构造函数Constructor[] constructors = clz1.getConstructors();
3)获取成员变量Field[] fields = clz1.getDeclaredFields(); Declared声明的,包含private类型的方法。
4)获取方法Method[] methods = clz1.getMethods();

  • Constructor类
    1)获取名称getName()
    2)创建对象newInstance()
public class Test01 {
    public static void main(String[] args) {
        User user = new User("zhangsan", 20);
        Class clz = user.getClass();
        System.out.println("clz.getName():" + clz.getName());

        try {
            User user2 = (User) clz.newInstance();
            System.out.println("user2.age:" + user2.getAge());
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}

在这里插入图片描述

  • Field类
    1)getName()获取名称
    2)getType()获取类型
    3)set(Object obj, Object value)设置值
import java.lang.reflect.Field;

public class Tmp {

    private int id;
    private String name;
    private double price;

    public Tmp() {
        this.id = 0;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Tmp{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", price=" + price +
                '}';
    }

    public static void main(String[] args) {
        Tmp tmp = new Tmp();
        tmp.setName("辣椒");
        tmp.setPrice(100);
        try {
            Class clz = tmp.getClass();
            Field fieldPrice = clz.getDeclaredField("price");
            System.out.println("price:" + fieldPrice.get(tmp));

            Field fieldId = clz.getDeclaredField("id");
            System.out.println("type:" + fieldId.getType());
            int val = fieldId.getInt(tmp);
            System.out.println("id:" + val);

            fieldId.set(tmp, 12);
            System.out.println("id->" + fieldId.getInt(tmp));

        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}

在这里插入图片描述

  • Method类
    1)invoke()方法调用
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class MethodTest {
    private int id;
    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int m1(){
        System.out.println("m1()...");
        return 0;
    }

    public int m2(int param1, int param2) {
        System.out.println("m2()..." + param1 + " _ " + param2 + "");
        return param1+param2;
    }

    public static void main(String[] args) {
        MethodTest methodTest = new MethodTest();
        try {
            Class clz = Class.forName("MethodTest");
            Method m1 = clz.getMethod("m1",null);
            System.out.println("m1计算结果:" + m1.invoke(methodTest, null));

            Method m2 = clz.getMethod("m2", int.class, int.class);
            Object obj = m2.invoke(methodTest, 3, 4);
            System.out.println("m2计算结果:" + Integer.valueOf(obj.toString()));
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}

在这里插入图片描述

三、小记

慢慢探索、深入,争取写出点有意义的东西。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!