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

---------- <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>、期待与您交流! -----------
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值