5.4技术补充——反射机制

JAVAWEB文章索引
JAVA反射机制:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性。其可以于运行时加载、探知、使用编译期间完全未知的classes,并得知名称,获悉其完整构造(但不包括methods定义),生成其对象实体、或对其fields设值、或唤起其methods。
主要探讨的类:

描述
Class 类对象,可以获取类名,父类,继承的接口
Constructor 类的构造方法对象,可以获取构造方法,并用其创建该类的实例
Method 类的普通方法对象,可以调用类中的普通方法
Field 类的属性对象,可以得到或者设置属性值

为了便于演示,先构建一个Person类

package com.bean;

interface Eatable{}

public class Person implements Eatable{
    private int id;
    String name;

    public Person() {
        super();
    }
    public Person(int id, String name) {
        super();
        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;
    }
    @Override
    public String toString() {
        return "Person [id=" + id + ", name=" + name + "]";
    }
}

Class:
要构造Person类的类对象有三种方式,
Class person_class1 = Person.class;
Class person_class2 = Class.forName(“com.bean.Person”);
Class person_class3 = new Person().getClass();
由于第二种只需要字符串,依赖性更低,所以最好使用第二种。

package com.reflex;

import com.bean.Person;
public class ClassDemo {

    public static void main(String[] args) throws Exception {

        Class person_class = Class.forName("com.bean.Person");
        System.out.println(person_class.getName());//获取全名称(包名+类名)
        System.out.println(person_class.getSimpleName());//获取类名
        System.out.println(person_class.getSuperclass().getSimpleName());//获取父类,再获取父类名
        Class[] interfacesArr = person_class.getInterfaces();
        for (Class interf : interfacesArr) {
            System.out.println(interf.getSimpleName());
        }
    }
}

运行结果:

com.bean.Person
Person
Object
Eatable

Constructor:

package com.reflex;

import java.lang.reflect.Constructor;

public class ConstructorDemo{
    public static void main(String[] args) throws Exception {
        //构造无参的对象
        Class person_class = Class.forName("com.bean.Person");
        Constructor cons1 = person_class.getConstructor(null);//获取无参的构造方法的对象
        Object obj1 = cons1.newInstance(null);//通过无参的构造方法对象实例化一个对象
        System.out.println(obj1.toString());
        //构造有参的对象
        Constructor cons2 = person_class.getConstructor(int.class, String.class);//获取有参的构造方法的对象
        Object obj2 = cons2.newInstance(100, "张三");
        System.out.println(obj2.toString());
    }
}

运行结果:

Person [id=0, name=null]
Person [id=100, name=张三]

Method:

package com.reflex;

import java.lang.reflect.Method;

public class MethodDemo {
    public static void main(String[] args) throws Exception{
        Class person_class = Class.forName("com.bean.Person");
        Object obj = person_class.newInstance();//获取无参构造函数实例对象的简便方法
        Method setName = person_class.getMethod("setName", String.class);//通过方法名和参数类型获得该方法
        setName.invoke(obj, "张三");//相当于是obj.setName("张三")
        Method getName = person_class.getMethod("getName", null);
        Object result = getName.invoke(obj, null);
        System.out.println(result);
    }
}

运行结果:

张三

Feild:

package com.reflex;

import java.lang.reflect.Field;

public class FeildDemo {
    public static void main(String[] args) throws Exception{
        Class person_class = Class.forName("com.bean.Person");
        Object obj = person_class.newInstance();
        Field name = person_class.getDeclaredField("name");//获取name属性(包括私有化)
        System.out.println(name.getName()+"-"+name.getType().getSimpleName());//输出方法名和方法类型

        name.setAccessible(true);//设true后可以直接操作私有化属性
        name.set(obj, "张三");
        System.out.println(name.get(obj));

    }
}

运行结果:

name-String
张三

猜你喜欢

转载自blog.csdn.net/smallhc/article/details/81084962
5.4