利用java反射分析对象

反射库提供了一个非常丰富且精心设计的工具集,以便编写能够动态操作Java代码的程序。这项功能被大量用在JavaBean中,他是Java组件的体系结构。在设计或运行中添加新类时,能够快速地应用开发工具动态地查询新添类的能力。
能够分析类能力的程序称为反射。反射机制可以用来:

  • 在运行时分析类的能力
  • 在运行时查看对象,例如编写一个toString方法供所有类使用
  • 实现通用的数组操作代码
  • 利用Method对象
    反射功能强大,内容复杂。使用他的主要人员是工具构造者,不是应用程序员。

在程序运行期间,Java运行时始终为所有对象维护一个被称为运行时的类型标识。这个信息跟踪每个对象所属的类。虚拟机利用运行时类型信息选择相应的方法执行。
然而,可以通过专门的java 类访问这些信息。保存这些信息的类称为Class。Object类的getClass()方法将会返回一个Class类型实例。

如同一个Employee对象表示一个特定的员工一样,一个Class对象将表示一个特定的类的属性。最常用的是getName方法,返回类的名字。

在 java.lang.reflect 包中有三个类Field,Method,Constructor分别用于描述类的域、方法和构造器。这三个类都有一个叫做getName的方法,用来返回项目的名称。 Field类有一个getType方法,用来返回描述域所属类型的class对象。Method和Constructor类有能够报告参数类型的方法,Method类还有一个能够报告返回类型的方法。这三个类还有一个getModifier的方法,他将返回一个整数值,用不同的位开关描述public和static这样的修饰符的使用情况。

Class类中的getFields,getMethods和getConstructors方法将分别返回类提供的public域、方法、构造器数组,其中包括超类的公有成员。Class类的getDeclaredFields,getDeclaredMethods和getDeclaredConstructors方法将分别返回类中声明的全部域、方法和构造器,其中包含私有和受保护的成员,但不包括超类的成员。

package ReflectTest;


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

public class ReflectTest {

    public static void main(String[] args) throws NoSuchMethodException,IllegalAccessException, SecurityException,NoSuchFieldException, InvocationTargetException {

        Employee employee = new Employee("tn","001","dev");
        Class employCl = employee.getClass();//获得employee的class对象
        Field f = employCl.getField("name");//获得employee对象的域
        Object name = f.get(employee).toString();//域.get(实例对象名)能够获得实例中的这个域(属性)的值
        System.out.println(name);

        Method method1 = employCl.getMethod("getName");//获取employee对象的getName方法
        System.out.println(method1.toString());//将方法名转成string类型输出
        String m2 = method1.invoke(employee).toString();//方法名通过invoke(实例名)能够执行
        System.out.println(m2);
    }
}

package ReflectTest;

public class Employee {

    public String name;
    private String id;
    private String dep;

    public Employee(String name, String id, String dep){
        this.name = name;
        this.id = id;
        this.dep = dep;
    }

    public String getName() {
        return name;
    }

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

    public String getId() {
        return id;
    }

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

    public String getDep() {
        return dep;
    }

    public void setDep(String dep) {
        this.dep = dep;
    }


    public Employee(){
        System.out.println("初始化Employee");
    }


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值