Java反射机制 笔记
2014-02-21 22:16
465 查看
import java.lang.reflect.*; class Demo2{ public static void main(String[] args)throws Exception{ //反射 //反射技术作用? //Person p = new Person(); //p.age = 10; //只告诉你有一个类,类的名称叫做"Person" String className = "Person"; Class c = Class.forName(className); System.out.println("--------该类所有可以访问的公共字段(变量)------------"); /* * Field[] getFields() 返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的--所有可访问*公共字段**/ Field[] fs = c.getFields(); for(int i =0;i<fs.length;i++){//只能看见public声明的变量 //返回一个 Class 对象,它标识了此 Field 对象所表示字段的声明类型。 System.out.println("字段声明类型:" + fs[i].getType()); //返回一个String对象,表示此 Field 对象表示的字段的名称。 System.out.println("字段名称:" + fs[i].getName()); } System.out.println("------------该类声明的所有字段------------------"); /* * Field[] getDeclaredFields() 返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的--所有字段--- */ Field[] fs1 = c.getDeclaredFields(); for(Field f:fs1){ System.out.println(f); } System.out.println("------------该类声明的所有构造方法---------------"); /*Constructor<?>[] getDeclaredConstructors() 返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法。 * */ Constructor[] cs = c.getDeclaredConstructors(); for(int i = 0;i<cs.length;i++){ System.out.println(cs[i]); } //cs[1].newInstance() 一个Person类的对象 /*类 Constructor<T> * T newInstance(Object... initargs) 使用此 Constructor 对象表示的构造方法来--创建该构造方法的声明类的新实例--,并用指定的初始化参数初始化该实例。 */ // Object obj = cs[1].newInstance(); Object obj = cs[0].newInstance(6);//创建对象实例 System.out.println("------------------该类声明的所有方法-------------"); /* *Method[] getDeclaredMethods() 返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法, ----包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。---- */ Method[] ms = c.getDeclaredMethods(); for(int i = 0;i<ms.length;i++){ System.out.println(ms[i]); } System.out.println("-----------------设置和获取对象的变量值-------------"); fs[0].setInt(obj, 5);//setInt(Object obj, int i) 将字段的值设置为指定对象上的一个 int 值。 //getInt(Object obj) //获取 int 类型或另一个通过扩展转换可以转换为 int 类型的基本类型的静态或实例字段的值 System.out.println(fs[0].getInt(obj)); System.out.println("----------------调用对象的方法-------------------"); /*类 Method * Object invoke(Object obj, Object... args) 对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。 */ ms[0].invoke(obj); ms[1].invoke(obj, "tom"); //----------------------------------------【总结】 //反射的意义在于***不使用正常的Java获取对象执行方法,属性赋值,属性获取的方式进行操作对象*** /* 一般情况是:已知类名称,使用类名进行创建对象 而反射是:使用类名称(类名称是一个String变量),创建对象 <主要思路>: ———Constructor 创建对象 ———Method.invoke 调用方法 ———Field 调用变量 */ } } class Person{ public int pub; public int pub2; protected int pro; int def; private int pri; static int sta; final int fin = 1; public Person(){ } public Person(int a){ this.pub = a; } public void fnPub(){ System.out.println("fnPub method"); } public void welcome(String s){ System.out.println("Welcome " + s); } }
运行结果:
--------该类所有可以访问的公共字段(变量)------------
字段声明类型:int
字段名称:pub
字段声明类型:int
字段名称:pub2
------------该类声明的所有字段------------------
public int Person.pub
public int Person.pub2
protected int Person.pro
int Person.def
private int Person.pri
static int Person.sta
final int Person.fin
------------该类声明的所有构造方法---------------
public Person(int)
public Person()
------------------该类声明的所有方法-------------
public void Person.fnPub()
public void Person.welcome(java.lang.String)
-----------------设置和获取对象的变量值-------------
5
----------------调用对象的方法-------------------
fnPub method
Welcome tom