欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

5.4技术补充——反射机制

程序员文章站 2022-05-13 15:51:41
...

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
张三
相关标签: 反射 java class

上一篇: 生成验证码

下一篇: 验证码生成