Java-反射(学习笔记)

来源:互联网 发布:accorpus数据库 编辑:程序博客网 时间:2024/06/05 23:19

反射:做框架使用。一个类有多个组成部分,例如:成员变量,方法,构造方法等。反射就是加载类,并解剖出类的各个组成部分。

加载类:Java中有一个class类用于代表某一个类的字节码,它提供了加载某个类字节码到内存中的方法:forName(),并使用class对象进行封装。

得到一个类的字节码的三种方式:以创建好的person类为例。

package respect;public class demo {public static void main(String[] args) throws ClassNotFoundException {//方法1Class clazz1 = Class.forName("respect.Person");//包名+类名//方法2Class clazz2 = new Person().getClass();//方法3Class clazz3 = Person.class;}}

反射的作用:我们可以将反射理解成解剖或观察的含义。通过反射机制可以获取任意一个类的属性、方法。对于任意一个对象,可以调用它的任意一个方法。

getConstructor与getDeclaredConstructor;getMethod与getDeclaredMethod;getField与getDeclaredField这些方法分别用于从类中获取出构造函数、方法和成员变量,获取的这些数据分别用Constructor、Method、Field对象表示。

一、利用Constructor创建对象(代码实例)

(1)创建person类

package respect;import java.awt.List;public class Person {public String name = "aaaa";public Person(){System.out.println(name);}public Person(String name){System.out.println(name);}public Person(String name,int password){System.out.println(name+":"+password);}private Person(List list){System.out.println("list");}}

(2)反射构造函数

package respect;import java.lang.reflect.Constructor;import java.util.ArrayList;import java.util.List;import org.junit.Test;//反射类的构造函数,创建类的对象public class Demo2 {//反射构造函数:public Person()@Testpublic void test1() throws Exception{       Class clazz = Class.forName("respect.Person");       Constructor c = clazz.getConstructor(null);       Person p = (Person)c.newInstance(null);           System.out.println(p.name);}@Testpublic void test2() throws Exception{Class clazz = Class.forName("respect.Person");Constructor c = clazz.getConstructor(String.class);Person p = (Person)c.newInstance("xxx");System.out.println(p.name);}@Testpublic void test3() throws Exception{Class clazz = Class.forName("respect.Person");Constructor c = clazz.getConstructor(String.class,int.class);Person p = (Person)c.newInstance("xxx",12);System.out.println(p.name);}//@Testpublic void test4() throws Exception{Class clazz = Class.forName("respect.Person");Constructor c = clazz.getDeclaredConstructor(List.class);c.setAccessible(true);//暴力反射Person p = (Person)c.newInstance(new ArrayList());System.out.println(p.name);}//创建对象的另外一种途径@Testpublic void tast5() throws ClassNotFoundException, InstantiationException, IllegalAccessException{Class clazz = Class.forName("respect.Person");Person p = (Person)clazz.newInstance();System.out.println(p);}}

二、利用Method执行方法

Method对象提供如下方法,用于执行它所代表的方法:public Object invoke(Object obj,Object...args)
使用Method执行无参、有参、多个参(带数组和基本数据类型)、静态、私有的方法。
(1)person类

package respect;import java.awt.List;import java.io.InputStream;public class Person {//方法的几种类型public void aa1(){System.out.println("aa1");}public void aa1(String name,int password){System.out.println(name+":"+password);}public Class[] aa1(String name,int[] password){return new Class[]{String.class};}private void aa1(InputStream in){System.out.println(in);}public static void aa1(int num){System.out.println(num);}}

(2)反射方法

package respect;import java.io.InputStream;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;//反射类的方法 public class Demo3 {//反射类的方法:public void aa1()public void test1() throws Exception{Person p = new Person();Class clazz = Class.forName("respect.Person");//加载类Method method = clazz.getMethod("aa1", null);method.invoke(p, null);}//反射类的方法:public void aa1(String name,int password)public void test2() throws Exception{Person p = new Person();Class clazz = Class.forName("respect.Person");Method method = clazz.getMethod("aa1",String.class,int.class);method.invoke(p,"love",520);}//反射类的方法:public Class[] aa1(String name,int[] password)public void test3() throws Exception{Person p = new Person();Class clazz = Class.forName("respect.Person");Method method = clazz.getMethod("aa1", String.class,int[].class);Class cs[] = (Class[]) method.invoke(p, "love",new int[]{1,2,3});System.out.println(cs[0]);}//反射类的方法:private void aa1(InputStream in)public void test4() throws Exception{Person p = new Person();Class clazz = Class.forName("respect.Person");Method method = clazz.getDeclaredMethod("aa1", InputStream.class);//privatemethod.setAccessible(true);method.invoke(p, new FileInputStream("c:\\love.txt");//文件地址和名称}//反射类的方法:public static void aa1(int num)public void test5() throws Exception{Class clazz = Class.forName("respect.Person");Method method = clazz.getMethod("aa1", int.class);method.invoke(null, 520);//静态方法调用时不需要对象}}

(3)反射类里面特殊方法-main方法

*在Person类里面添加main方法

public class Person {public static void main(String[] args){System.out.println("main");}}

*反射main方法
public void test6() throws Exception{Class clazz = Class.forName("respect.Person");Method method = clazz.getMethod("main", String[].class);method.invoke(null, new Object[]{new String[]{"a","b"}});//或者使用method.invoke(null,(Object)new String[]{"a","b"}}
三、获取字段

字段:公共的、私有的、静态的,封装数据;反射的目的是为了添加数据。

(1)为Person类添加字段

public class Person {public String name = "love";private int password = "520";       }

(2)反射字段

package respect;import java.lang.reflect.Field;public class Demo5 {//反射字段:public String name = "love";public void test1() throws Exception{Person p = new Person();Class clazz = Class.forName("respect.Person");Field f = clazz.getField("name");/*更严谨的做法:未知字段类型,获取并判断    Object value = f.get(p);//获取字段的值Class type = f.getType();//获取字段的类型if(type.equals(String.class)){String svalue = (String) value;System.out.println(svalue);}*/String name = (String)f.get(p);System.out.println(name);//设置字段的值f.set(p,"spring");System.out.println(p.name);}//反射字段:private int password;public void test2() throws Exception{Person p = new Person();Class clazz = Class.forName("respect.Person");Field f = clazz.getDeclaredField("password");f.setAccessible(true);System.out.println(f.get(p));}}






原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 微信图片在电脑上打印不清楚怎么办 遇到职业搞坏淘宝店铺的买家怎么办 眼破裂伤无光感半个月怎么办 出了虫的豆豆熬稀饭喝了怎么办? 果汁阳台月季叶子掉光了怎么办 近看好看远看难看该怎么办 衣服褶皱没有熨斗的情况下怎么办 裤子磨得发亮怎么办也没有电熨斗 老是在灯箱拍照对眼睛不好怎么办 电信光纤宽带账号密码忘记了怎么办 遇到尴尬的事情自己缓不过来怎么办 注销微信账号显示非法请求怎么办 微信备份以前的被覆盖了怎么办 之前微信号被新微信号覆盖了怎么办 微信发出的消息变成绿色怎么办 收了客户的资金被骗走了怎么办 淘宝退回去的衣服店家不接收怎么办 淘宝同款衣服价格相差很大该怎么办 淘宝买的衣服退回去了不退钱怎么办 淘宝客人退回的衣服有口红印怎么办 淘宝拍产品照片被投诉著作权怎么办 员工总在节假日忙的时候请假怎么办 买东西商家少给了货应该怎么办 买家退回的衣服有污渍卖家该怎么办 商家说衣服有污渍不退怎么办 退回商家换货不给寄应怎么办 毕业照跟拍摄影师拍砸了怎么办 韵达快递寄快递快递单号丢了怎么办 韵达快递把我的户口本弄丢了怎么办 淘宝卖家发货与实际货物不符怎么办 寄出去的快递不知道物流单号怎么办 淘宝买家所需要的货物填错怎么办 淘宝卖家顾客拒绝签收货要怎么办 闲鱼买家申请退货退款不发货怎么办 在闲鱼买东西买家恶意退货怎么办 淘宝卖家给的退货地址是国外怎么办 淘宝顾客下单了一件代发怎么办 闲鱼上卖东西快递单号填错了怎么办 淘宝收货后快递显示不签收怎么办 淘宝快递显示签收但没收到货怎么办 国外客人收到货后嫌弃质量差怎么办