这是一篇简单的随笔,基本涉及都是实际操作和实用代码,具体理论原理后续更新。
获取反射加载类(获取类的字节码)的3种方式:
1、Class class1=Class.forName("lession_svc.lession_svc.reflact.Person");2、Class class2 =new Person().getClass();3、Class class3=Person.class;
在JAVA中,解剖类Class提供的常用方法:
public Constructor<T> getConstructor(Class<?>... parameterTypes) 获取public类型构造函数
public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 获取private类型构造函数
Class class1=Class.forName("lession_svc.lession_svc.reflact.Person");Constructor c= class1.getDeclaredConstructor(String.class);c.setAccessible(true); //暴力破解c.newInstance("张三");
public Method getMethod(String name, Class<?>... parameterTypes) 获取类的public类型方法
public Method getDeclaredMethod(String name, Class<?>... parameterTypes) 获取类的private类型方法
Class class1=Class.forName("lession_svc.lession_svc.reflact.Person");Person p=(Person)class1.newInstance();Method method= class1.getDeclaredMethod("Head", String.class);method.setAccessible(true);//打开访问权限method.invoke(p, "李四");
获取静态方法并执行:
Class class1=Class.forName("lession_svc.lession_svc.reflact.Person");//Person p=(Person)class1.newInstance();Method method= class1.getMethod("Head", Integer.class);method.invoke(null, "李四");
注意:反射调用参数为数组时,反射会进行拆解。例:
Class class1=Class.forName("lession_svc.lession_svc.reflact.Person");//Person p=(Person)class1.newInstance();Method method= class1.getMethod("main", String[].class);method.invoke(null, (Object)new String[] {"12"});//此处需要做参数包装,不做包装,反射会进行拆解数组参数,最终为:main(String s1),//与期望main(String [] args) 不相同
public Field getField(String name) 获取类public类型字段方法。
例:
@Testpublic void func7() {try {Class class1=Class.forName("lession_svc.lession_svc.reflact.Person");Person p=(Person) class1.newInstance();Field name=class1.getField("name");//设置字段值:name.set(p, "张飞");//读取值Object object=name.get(p);//获取字段类型Class type=name.getType();if(type.equals(String.class)) {String vString=(String) object;System.out.println(vString);}//2 .System.out.println(p.getName());} catch (Exception e) {e.printStackTrace();}}
public Field getDeclaredField(String name) 获取private 字段方法。
例:
@Testpublic void func8() {try {Class class1=Class.forName("lession_svc.lession_svc.reflact.Person");Person p=(Person) class1.newInstance();Field name=class1.getDeclaredField("age");name.setAccessible(true);//设置字段值:name.set(p, 12);//读取值Object object=name.get(p);//获取字段类型Class type=name.getType();if(type.equals(String.class)) {String vString=(String) object;System.out.println(vString);}//2 .System.out.println(p.getAge());} catch (Exception e) {e.printStackTrace();}}
结语:
世界上的事就这么奇怪——最可怕,最丑陋的东西,在某一刹那间看来,往往比什么都美丽,比什么都可爱,--古龙
文章转载自韩丨烟雨平生,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




