1、java反射机制定义
所谓的反射机制就是java语言在运行时拥有一项自观的能力。通过这种能力可以彻底的了解自身的情况为下一步的动作做准备。例如,使用它能获得 Java 类中各成员的名称并显示出来
2、java反射机制的关键类
Java的反射机制的实现要借助于4个类:class,Constructor,Field,Method;
class——类对象,
Constructor——类的构造器对象,
Field——类的属性对象,
Method——类的方法对象。通过这四个对象我们可以粗略的看到一个类的各个组 成部分。
3、java反射机制事例
1)class——类对象用 java.lang.Class 类来描述类和接口等。
package com.centit.reflect; import java.lang.reflect.Method; /** * @author zjh * */ class Person{ private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Person(String name, int age) { super(); this.name = name; this.age = age; } public Person() { super(); } } public class DumpMethods { public static void main(String[] args) { try { //定义一个Person实例对象 Person man=new Person("测试",30); //获得一个 Class 对象的方法
Class manClass=man.getClass();
//获得一个 Class 对象的方法 Class womanClass=Class.forName("com.centit.reflect.Person");
//获得一个 Class 对象的方法 Class boyClass=Person.class; System.out.println(manClass.getName()); System.out.println(womanClass.getName()); System.out.println(boyClass.getName()); } catch (Throwable e) { System.err.println(e); } } } 输出结果:
com.centit.reflect.Person com.centit.reflect.Person com.centit.reflect.Person
2)Constructor——类的构造器对象
public class DumpMethods { public static void main(String[] args) { try { //定义一个Person实例对象 Person man=new Person("测试",30);
Class manClass=man.getClass(); //获取构造对象 Constructor manCon[]=manClass.getDeclaredConstructors(); for(int i=0;i<manCon.length;i++){ Constructor con=manCon[i]; System.out.println("name========"+con.getName()); System.out.println("decl class========="+con.getDeclaringClass()); Class param[]=con.getParameterTypes(); for(int j=0;j<param.length;j++){ System.out.println("param------"+param[j]); } } } catch (Throwable e) { System.err.println(e); } } }
输出结果:
name========com.centit.reflect.Person
decl class=========class com.centit.reflect.Person
param------class java.lang.String
param------int
name========com.centit.reflect.Person
decl class=========class com.centit.reflect.Person
3)Field——类的属性对象
public class DumpMethods { public static void main(String[] args) { try { //定义一个Person实例对象 Person man=new Person("测试",30); Class manClass=man.getClass(); Field manField[]=manClass.getDeclaredFields(); for(int i=0;i<manField.length;i++){ Field fie=manField[i]; System.out.println("name====="+fie.getName()); System.out.println("type====="+fie.getType()); } } catch (Throwable e) { System.err.println(e); } } }
4) Method——类的方法对象
public class DumpMethods { public static void main(String[] args) { try { // 定义一个Person实例对象 Person man = new Person("测试", 30); Class manClass = man.getClass(); Method manMethod[] = manClass.getDeclaredMethods(); for (int i = 0; i < manMethod.length; i++) { Method m = manMethod[i]; System.out.println("name = " + m.getName()); System.out.println("decl class = " + m.getDeclaringClass()); Class pvec[] = m.getParameterTypes(); for (int j = 0; j < pvec.length; j++) System.out.println("param #" + j + " " + pvec[j]); Class evec[] = m.getExceptionTypes(); for (int j = 0; j < evec.length; j++) System.out.println("exc #" + j + " " + evec[j]); System.out.println("return type = " + m.getReturnType()); System.out.println("-----"); } } catch (Throwable e) { System.err.println(e); } } }
输出结果:
name = getName
decl class = class com.centit.reflect.Person
return type = class java.lang.String
-----
name = setName
decl class = class com.centit.reflect.Person
param #0 class java.lang.String
return type = void
-----
name = getAge
decl class = class com.centit.reflect.Person
return type = int
-----
name = setAge
decl class = class com.centit.reflect.Person
param #0 int
return type = void
-----