---------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! -----------
/**
* 反射就是在运行期间动态获取信息和动态调用对象的方法的功能*
* (1)首先要获得类类型 Class Xxx
* a。Class Xxx=Class.forname("Xxx")
* b。Class Xxx=Xxx.class
* c. Class Xxx=xxx.getClass()
* 其中主要用a和b,c需要实例来调用getclass方法,比较麻烦
*
* (2)创建类实例
* a. Object xxx=Xxx.newInstance();
* Xxx必须要有无参构造函数,否则必须先获取构造函数
* b. Object xxx=Xxx.getConstruct( ... ).newInstance( ... );
* 前后参数列表类类型需要一致
*
* (3)获取构造函数
* 一般:Method method=Xxx.getConstruct(...)
* 其中参数是要获取的构造函数的参数列表类类型,无参就是null
* 调用构造函数:metod.invoke(xxx,...)
*
* (4)获取一般函数
* a.Method m=Xxx.getMethod("函数名", ... )
* b.获取公有方法:Method[] m=Xxx.getMethods()
* c。获取私有发放 Method m=Xxx.gerDeclareMethod("函数名", ... )
* d。获取本类所有方法:Method[] m=Xxx.getDeclareMethods()
* 使用:method.invoke(xxx, ... )
* 使用私有方法前要先设置m.setAccessible(true);
*
* (5)获取字段
* Field field=Xxx.getDeclaredField(" ");
* 若要访问私有字段 field.setAccessible(true);
* 取:Object obj=field.get(xxx)
* 存:field.set(xxx, )
*
* ( 以下是我的练习代码)
*/
package threaddemo.src;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class ReflectTest {
public static void main(String[] arg)throws Exception{
Class<MyClass> clazz=MyClass.class;
//调用类型的公有字段获取类类型
Method method=clazz.getMethod("printStr",String.class,int.class);
//获取公有函数
Method privateMethod=clazz.getDeclaredMethod("privateFun",String.class);
//获取私有函数
method.invoke(clazz.newInstance(),"ni hao ma?",333);
//调用公有函数
privateMethod.setAccessible(true);
privateMethod.invoke(clazz.newInstance(),"haha");
//调用食欲函数
Class clas1=Class.forName("threaddemo.src.MyClass");
//用类名获取类类型
Constructor constructor=clas1.getConstructor(String.class);
Object o1=constructor.newInstance("hehe");
//调用有参构造函数创建对象
Object o2=clas1.newInstance();
//调用无参构造函数创建对象
Method method2=clas1.getMethod("disp",int.class);
method2.invoke(o2,3);
//获取和使用单个公有函数
Method[] clas1fun=clas1.getMethods();
System.out.println("clas1fun have "+clas1fun.length +"function");
clas1fun[0].invoke(o1,"xxoo",123);
clas1fun[1].invoke(o1,3);
//获取和使用多个函数
for(int i=0;i<clas1fun.length;i++){
System.out.println(clas1fun[i].getName());
}
//打印函数列表
Field field=clas1.getDeclaredField("age");
//field.setAccessible(true);
//私有字段操作前要设置
Object obj=field.get(o1);
System.out.println(obj);
field.set(o1,87);
System.out.println(field.get(o1));
//字段的存取
}
}
class MyClass{
public MyClass(){}
public int age=99;
public MyClass(String str){
System.out.println("public MyClass(String):"+str);
}
public void printStr(String str,int a){
System.out.println("public printStr(String,int):"+str+" "+a);
}
public void disp(int a){
System.out.println("public disp(int):");
for(int i=0;i<a;i++){
for(int j=0;j<a;j++){
System.out.print("*");
}
System.out.println();
}
}
private void privateFun(String str){
System.out.println("private privateFun:"+str);
}
}
---------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! -----------