反射的所有用法


反射的主要应用是用来做框架的

1.加载类的三种方式:

//加载类方法1: String classname ="cn.itcast.bean.Person"; Class clazz1=Class.forName(classname); //获取类的字节码拿到类 //加载类方法2: Class clazz2=Person.class; //在框架中用的不多 //加载类方法3: Class clazz3=new Person().getClass();


2.反射构造方法创建类的实例:

构造函数有四种方式:无参、有参、多个参数、私有构造函数。

public Person(){} public Person(String name){ this.name=name; } public Person(String name,List list){ } private Person(Set set){ }


针对以上四种构造方法的反射如下:

//反射无参的构造函数 @Test public void test2 () throws Exception{ String classname ="cn.itcast.bean.Person"; Class clazz1=Class.forName(classname); //加载类 Constructor c=clazz1.getConstructor(null);//拿到无参的构造函数 Object obj =c.newInstance(null); //创建实例对象 System.out.println(obj); } //反射有参的构造函数 @Test public void test3 () throws Exception{ String classname ="cn.itcast.bean.Person"; Class clazz1=Class.forName(classname); Constructor c=clazz1.getConstructor(String.class);//拿到有参的构造函数 Object obj =c.newInstance("aaa"); //创建实例对象 System.out.println(obj); } //反射有多个参数的构造函数 @Test public void test4 () throws Exception{ String classname ="cn.itcast.bean.Person"; Class clazz1=Class.forName(classname); Constructor c=clazz1.getConstructor(String.class,List.class);//拿到多个参数的构造函数 Object obj =c.newInstance("bbb",new ArrayList()); System.out.println(obj); } //反射私有的构造函数 @Test public void test5 () throws Exception{ String classname ="cn.itcast.bean.Person"; Class clazz1=Class.forName(classname); Constructor c=clazz1.getDeclaredConstructor(Set.class);//得到类里面声明的成员 c.setAccessible(true); //暴力反射 Object obj =c.newInstance(new HashSet()); System.out.println(obj); }

3.反射方法:

方法共有五几种形态:

public void a1(){ System.out.println("hahaa"); } public void a2(String name){ System.out.println(name); } public String a3(String name ,String password){ return name+password; } private String a4(List list){ return list.toString(); } private static void a5(String arr[]){ System.out.println(Arrays.asList(arr)); }


针对五种形态的反射方法如下:

//反射无参方法 @Test public void test1() throws Exception{ Person p=new Person(); Class clazz=Class.forName("cn.itcast.bean.Person");//拿到类 Method m=clazz.getMethod("a1",null); //反射无参数的构造方法 m.invoke(p,null); //执行无参构造方法 } //反射一个参数的方法 @Test public void test2() throws Exception{ Person p=new Person(); Class clazz=Class.forName("cn.itcast.bean.Person"); Method m=clazz.getMethod("a2",String.class); //反射有参数的构造方法 m.invoke(p,"aaaaa"); } //反射多个参数的方法 @Test public void test3() throws Exception{ Person p=new Person(); Class clazz=Class.forName("cn.itcast.bean.Person"); Method m=clazz.getMethod("a3",String.class,String.class); String result=(String) m.invoke(p,"aaaaa","bbbbbb"); System.out.println(result); } //反射私有的方法 @Test public void test4() throws Exception{ Person p=new Person(); Class clazz=Class.forName("cn.itcast.bean.Person"); Method m=clazz.getDeclaredMethod("a4",List.class); //得到声明的方法 m.setAccessible(true); //暴力反射 String result=(String) m.invoke(p,new ArrayList()); System.out.println(result); } //反射私有的静态方法 @Test public void test5() throws Exception{ Class clazz=Class.forName("cn.itcast.bean.Person"); Method m=clazz.getDeclaredMethod("a5",String [].class); m.setAccessible(true); //暴力反射 m.invoke(null,(Object)new String []{"1","2"}); }


4.反射字段

反射私有字段

//反射私有字段 @Test public void test1() throws Exception{ Person p =new Person(); Class clazz=Class.forName("cn.itcast.bean.Person"); Field f=clazz.getDeclaredField("name"); //拿到字段 f.setAccessible(true); f.set(p,"frk"); //封装值 String name=(String) f.get(p);//得到值 System.out.println(name); }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值