您的位置:首页 > 职场人生

【黑马程序员】java反射的学习总结

2014-06-17 09:44 387 查看
---------- <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>、期待与您交流! -----------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: