您的位置:首页 > 编程语言 > Java开发

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 反射