Java基础之 反射

反射用处到你想不到,,, 那就不想了,直接上代码

补充一下

一,先看一下反射的概念:
主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。
反射是java中一种强大的工具,能够使我们很方便的创建灵活的代码,这些代码可以再运行时装配,无需在组件之间进行源代码链接。但是反射使用不当会成本很高!
看概念很晕的,继续往下看。
二,反射机制的作用:
1,反编译:.class–>.java
2,通过反射机制访问java对象的属性,方法,构造方法等;
这样好像更容易理解一些,下边我们具体看怎么实现这些功能。
三,在这里先看一下sun为我们提供了那些反射机制中的类:
java.lang.Class;
java.lang.reflect.Constructor;
java.lang.reflect.Field;
java.lang.reflect.Modifier;
java.lang.reflect.Method;

首先来个Person类,今天就”射” 它了


public class Person {

    public int id;
    private String name;

    public Person() {}

    public Person(String name) {
        this.name = name;
    }

    public Person(int id) {
        this.id = id;
    }

    public Person(int id, String name) {
        this.id = id;
        this.name = 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;
    }
}

1.通过反射获取Class对象

    @Test
    public void run() throws Exception{
        // 三种方式获取class对象

        // 类名
        Class clazz1 = Person.class;
        // 通过实例
        Class clazz2 = new Person().getClass();
        // 通过全类名
        Class clazz3 = Class.forName("包名+Person");
    }

2.通过反射获取构造的对象

    @Test
    public void run2() throws Exception{
        // 获取Person的Class对象

        // 获取所有的构造器
        Constructor[] constructors = clazz.getConstructors();
        // 获取无参数的构造器
        Constructor constructor = clazz.getConstructor();   
        // 获取有参数的构造器
        Constructor c = clazz.getConstructor(int.class,String.class);

        // 创建无参实例  相对于调用无参数的构造方法
        // Person p = (Person) clazz.newInstance(); 
        Person person = (Person) constructor.newInstance();
        // 创建有参实例  相对于调用无参数的构造方法
        Person p2 = (Person) c.newInstance(1,"刘亦菲");
    }

3.通过反射获取属性的对象


@Test
    public void run3() throws Exception{
        // 获取Person的Class对象
        Class clazz = Class.forName("包名+Person");
        // 声明实例
        Person p = (Person) clazz.newInstance();
        // 获取是公有的name的属性对象
        Field id clazz.getField("id");      
        // 获取公有和私有属性对象
        Field name = clazz.getDeclaredField("name"); 
        //设置操作属性
        name.setAccessible(true);   
        // 设置属性  p.name = "刘亦菲";        
        name.set(p, "刘亦菲");         
    }

4.通过反射获取方法的对象


@Test
    public void run4() throws Exception{
        // 获取Person的Class对象
        Class clazz = Class.forName("包名+Person");
        // 声明实例
        Person p = (Person) clazz.newInstance();
        //获取共有的方法
        Method m = clazz.getMethod("setName", String.class);
        //获取所有方法
        Method m = clazz.getDeclaredMethod("setName", String.class);
        //私有方法需要设置 可操作性
        m.setAccessible(true);
        //m  为方法对象需要设置调用 invoke 调用相应方法
        m.invoke(p, "凤姐");      // p.setName = "凤姐";
    }

我们不生产代码,我们知识代码的搬运工,如有侵权,本人将第一时间删除
邮箱:[email protected]
QQ交流群:336237986

猜你喜欢

转载自blog.csdn.net/zhf6751134/article/details/78802951