admin 管理员组文章数量: 888297
反射(第十三天):基础反射与暴力反射
一,基础反射
字节码对象
获取字节码对象:
Class.forName(“类的全路径名”);
类名.Class
对象.getClass();
Student类:
package cn.tedu.reflection;public class Student {String name;int age;public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public void eat(int n){System.out.println("今天想吃"+n+"根冰淇凌");}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';} }
测试类:
package cn.tedu.reflection;import org.junit.Test;import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.TypeVariable; import java.util.Arrays;public class TestReflect {//反射的所有前提都是先获取字节码对象@Testpublic void test1() {try {Class<?> aClass = Class.forName("cn.tedu.reflection.Student");Class<?> studentClass = Student.class;Class<?> aClass1 = new Student().getClass();System.out.println(aClass);//字节码对象System.out.println(aClass.getName());//打印全路径名System.out.println(aClass.getSimpleName());//打印类名System.out.println(aClass.getPackage());//获取包对象System.out.println(aClass.getPackage().getName());//获取包名} catch (ClassNotFoundException e) {e.printStackTrace();}}//字节码获取构造方法@Testpublic void getConstruct() {Class<Student> aClass = Student.class;Constructor<?>[] constructors = aClass.getConstructors();//返回值类型是一个数组,数组中存着的是Student类的多个对象for (Constructor<?> s : constructors) {System.out.println(s);}TypeVariable<Class<Student>>[] typeParameters = aClass.getTypeParameters();//后去构造方法的参数类型System.out.println(Arrays.toString(typeParameters));}@Testpublic void getStudent() {Student s1 = new Student("张三", 18);Student s2 = new Student("李四", 19);Student s3 = new Student("王五", 17);Student[] s = {s1, s2, s3};for (Student ss : s) {System.out.println(ss.getName());}}@Testpublic void test() throws ClassNotFoundException {Class<?> aClass = Class.forName("cn.tedu.reflection.Student");Method[] methods = aClass.getMethods();for (Method method : methods) {System.out.println(method);//获取方法对象System.out.println(method.getName());//获取放法名Class<?>[] parameterTypes = method.getParameterTypes();//获取参数System.out.println(Arrays.toString(parameterTypes));}}@Testpublic void getFields() throws ClassNotFoundException {Class<?> aClass = Class.forName("cn.tedu.reflection.Student");Field[] fields = aClass.getFields();for (Field field : fields) {System.out.println(field.getName());}}@Testpublic void test2() throws ClassNotFoundException {Class<?> aClass = Class.forName("cn.tedu.reflection.Student");Constructor<?>[] constructors = aClass.getConstructors();for (Constructor constructor : constructors) {System.out.println(constructor.getName());Class[] parameterTypes = constructor.getParameterTypes();System.out.println(Arrays.toString(parameterTypes));}}@Testpublic void test3() throws ClassNotFoundException {Class<?> aClass = Class.forName("cn.tedu.reflection.Student");Method[] methods = aClass.getMethods();for (Method m : methods) {System.out.println(m.getName());Class<?>[] parameterTypes = m.getParameterTypes();System.out.println(Arrays.toString(parameterTypes));}}@Testpublic void test4() throws ClassNotFoundException {Class<?> aClass = Class.forName("cn.tedu.reflection.Student");Field[] fields = aClass.getFields();for (Field field : fields) {//注:属性不能访问私有和默认属性System.out.println(field.getName());//获取属性的类名System.out.println(field.getType().getName());//获取属性的类型名}}/** 通过反射创建指定类的Student指定类的对象* 方式一:通过字节码对象之间调用newInstance(),触发目标类的无参构造来创建对象* 方式二:先获取指定参数类型的构造函数对象* 再通过获取到的这个构造函数对象调用newInstance(参数列表)** */@Testpublic void test5() throws Exception {Class<?> aClass = Class.forName("cn.tedu.reflection.Student");Object o = aClass.newInstance();System.out.println(o);/** 以上我们newInstance()是创建无参构造* */Constructor<?> constructor = aClass.getConstructor(String.class, int.class);//本方法用于获取指定参数列表的构造函数,获取的是一个构造函数对象System.out.println(constructor);Student o1 = (Student) constructor.newInstance("海绵宝宝", 100000);System.out.println(o1.getName());System.out.println(o1.age);o1.eat(99);}@Testpublic void test6() throws Exception {Class<?> aClass = Class.forName("cn.tedu.reflection.Student");Object o = aClass.newInstance();Constructor<?> constructor = aClass.getConstructor(String.class, int.class);Student o1 = (Student) constructor.newInstance("派大星", 124314);o1.eat(12);System.out.println(o1.getName());System.out.println(o1.age);System.out.println(o1.name);} }
二,暴力反射
package cn.tedu.reflection;import org.junit.Test;import java.lang.reflect.Field; import java.lang.reflect.Method;public class TestPerson {//暴力反射需要设置权限私有可见@Testpublic void test1() throws NoSuchFieldException {Class<Person> p = Person.class;Field field = p.getDeclaredField("name");//通过field.setAccessible(true);System.out.println(field.getType());System.out.println(field.getType().getName());}@Testpublic void test2() throws Exception {Class<Person> p = Person.class;Field field = p.getDeclaredField("name");field.setAccessible(true);Person person = p.newInstance();field.set(person,"派大星");System.out.println(field.get(person));}@Testpublic void test3() throws Exception {//1获取Class字节码对象Class<Person> p = Person.class;//2通过暴力反射获取对象Method save = p.getDeclaredMethod("save", int.class, String.class);//想要执行私有方法,需要给方法设置私有可见,否则会报错save.setAccessible(true);//3通过反射的方式创建对象Person person = p.newInstance();//通过反射技术执行方法invoke方法Object o = save.invoke(person, 100, "派大星");} }
本文标签: 反射(第十三天)基础反射与暴力反射
版权声明:本文标题:反射(第十三天):基础反射与暴力反射 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/free/1699076588h326689.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论