律师网站建设哪家专业,小程序怎么开,教人做甜点的网站,seo页面优化公司概念#xff1a;
什么是反射? 利用反射可以无视修饰符获取类里面所有的属性和方法对于任何对象#xff0c;都能够调用它的方法和属性#xff0c;这种动态获取信息以及动态调用对象方法的功能称为Java的反射 反射的应用场景? 常见的有#xff1a; idea的智能提示、框架等…概念
什么是反射? 利用反射可以无视修饰符获取类里面所有的属性和方法对于任何对象都能够调用它的方法和属性这种动态获取信息以及动态调用对象方法的功能称为Java的反射 反射的应用场景? 常见的有 idea的智能提示、框架等(通过反射技术对象类进行了解剖得到了类的所有成员。) 使用反射的步骤 获取class对象获取Construtor创建对象 三种获取Class对象的方式 类名.class对象.getClass()Class.forName(类全名); public class Demo01 {public static void main(String[] args) throws ClassNotFoundException {ClassStudent aClass Student.class;System.out.println(aClass);Student student new Student();Class? extends Student aClass2 student.getClass();System.out.println(aClass2);Class? aClass3 Class.forName(day20.Student);System.out.println(aClass3);}
}Class获取构造方法对象 方法名说明Constructor?[] getConstructors()返回所有公共构造方法对象的数组Constructor?[] getDeclaredConstructors()返回所有构造方法对象的数组Constructor getConstructor(Class?… parameterTypes)返回单个公共构造方法对象Constructor getDeclaredConstructor(Class?… parameterTypes)返回单个构造方法对象
public class Demo02 {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {Class? aClass Class.forName(day20.Student);// Constructor?[] getConstructors() 返回所有公共构造方法对象的数组Constructor?[] constructors aClass.getConstructors();for (Constructor? constructor : constructors) {System.out.println(constructor);}System.out.println(-----------------------------------);// Constructor?[] getDeclaredConstructors() 返回所有构造方法对象的数组Constructor?[] gdc aClass.getDeclaredConstructors();for (Constructor? constructor : gdc) {System.out.println(constructor);}System.out.println(-----------------------------------);// Constructor getConstructor(Class?… parameterTypes) 返回单个公共构造方法对象//小括号中的顺序一定要跟构造方法的形参保持一致.Constructor? constructor aClass.getConstructor();System.out.println(constructor);Constructor? constructor2 aClass.getConstructor(String.class, int.class);System.out.println(constructor2);System.out.println(-----------------------------------);// Constructor getDeclaredConstructor(Class?… parameterTypes) 返回单个构造方法对象,不管还是公共都可以Constructor? declaredConstructor aClass.getDeclaredConstructor();System.out.println(declaredConstructor);}
}反射创建对象方法
Constructor类作用: 表示类中的构造方法 方法名说明T newInstance(Object…initargs)通过构造方法创建对象setAccessible(boolean flag)设置为true,表示取消访问检查
public class Test02 {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {// 获取Class对象Class? aClass Class.forName(day20.Student);// 获取构造方法,有参Constructor? constructor aClass.getConstructor(String.class, int.class);// 获取构造方法,无参Constructor? constructor2 aClass.getConstructor();// 获取构造方法,私有Constructor? declaredConstructor aClass.getDeclaredConstructor(String.class);// 暴力反射用反射可以看到公共和私有的但是被private修饰的成员是不可以直接使用的如果要用要调用setAccessible临时取消访问检查参数是truedeclaredConstructor.setAccessible(true);// 利用newInstance创建Student有参Student instance (Student) constructor.newInstance(韩信, 19);// 利用newInstance创建Student无参Student instance2 (Student) constructor2.newInstance();// 利用newInstance创建Student私有化Student instance3 (Student) declaredConstructor.newInstance(itzhuzhu);System.out.println(instance);System.out.println(------------------);System.out.println(instance2);System.out.println(------------------);System.out.println(instance3);}
}反射获取成员变量
Field类的作用: 表示类中的成员变量 如果获取Field: 1.获取Class对象 2.通过Class对象获取Field 方法名说明Field[] getFields ()返回所有公共成员变量对象的数组Field[] getDeclaredFields()返回所有成员变量对象的数组Field getField(String name)返回单个公共成员变量对象Field getDeclaredField(String name)返回单个成员变量对象
public class Demo03 {public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {Class? aClass Class.forName(day20.Student);// Field[] getFields () 返回所有公共成员变量对象的数组Field[] fields aClass.getFields();for (Field field : fields) {System.out.println(field);}System.out.println(-----------------);// Field[] getDeclaredFields() 返回所有成员变量对象的数组Field[] declaredFields aClass.getDeclaredFields();for (Field declaredField : declaredFields) {System.out.println(declaredField);}System.out.println(-----------------);// Field getField(String name)返回单个公共成员变量对象如果是private修饰的是获取不到的Field field aClass.getField(name);System.out.println(field);System.out.println(-----------------);// Field getDeclaredField(String name) 返回单个成员变量对象private修饰的也可以获取Field declaredField aClass.getDeclaredField(age);System.out.println(declaredField);}
}反射赋值成员变量
方法名说明void set(Object obj, Object value)赋值Object get(Object obj)获取值
public class Test {public static void main(String[] args) throws IllegalAccessException, InstantiationException, ClassNotFoundException, NoSuchFieldException {setMethod();getMethod();}private static void getMethod() throws ClassNotFoundException, NoSuchFieldException, InstantiationException, IllegalAccessException {Class? aClass Class.forName(day20.Student);// 获取对象fanshe.demo.StudentaaaField declaredField aClass.getDeclaredField(name);// 暴力反射declaredField.setAccessible(true);Student student (Student) aClass.newInstance();Object o declaredField.get(student);System.out.println(o);}private static void setMethod() throws ClassNotFoundException, NoSuchFieldException, InstantiationException, IllegalAccessException {// 获取class对象Class? aClass Class.forName(day20.Student);// 获取对象Field field aClass.getField(name);// set赋值Student student (Student) aClass.newInstance();field.set(student, 韩信);System.out.println(student);}
}获取成员方法并运行
Method类作用 表示类中的方法 如何得到Method对象 1.获取Class对象 2.通过Class对象获取Method 方法名说明Method[] getMethods()返回所有公共成员方法对象的数组包括继承的Method[] getDeclaredMethods()返回所有成员方法对象的数组不包括继承的Method getMethod(String name, Class?… parameterTypes)返回单个公共成员方法对象Method getDeclaredMethod(String name, Class?… parameterTypes)返回单个成员方法对象Object invoke(Object obj, Object… args)运行方法
学生类 public class Student {//私有的无参无返回值private void show() {System.out.println(私有的show方法无参无返回值);}//公共的无参无返回值public void function1() {System.out.println(function1方法无参无返回值);}//公共的有参无返回值public void function2(String name) {System.out.println(function2方法有参无返回值,参数为 name);}//公共的无参有返回值public String function3() {System.out.println(function3方法无参有返回值);return aaa;}//公共的有参有返回值public String function4(String name) {System.out.println(function4方法有参有返回值,参数为 name);return aaa;}}测试类
public class Test {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException {Class? aClass Class.forName(day20.Student);// Method[] getMethods() 返回所有公共成员方法对象的数组包括继承的Method[] methods aClass.getMethods();for (Method method : methods) {System.out.println(method);}System.out.println(------------------);// Method[] getDeclaredMethods() 返回所有成员方法对象的数组不包括继承的Method[] methods2 aClass.getDeclaredMethods();for (Method method : methods2) {System.out.println(method);}System.out.println(------------------);// Method getMethod(String name, Class?… parameterTypes) 返回单个公共成员方法对象Method method aClass.getMethod(function1);Method method2 aClass.getMethod(function2, String.class);System.out.println(method);System.out.println(method2);System.out.println(------------------);// Method getDeclaredMethod(String name, Class?… parameterTypes) 返回单个成员方法对象Method show aClass.getDeclaredMethod(show);System.out.println(show);System.out.println(------------------);// Object invoke(Object obj, Object… args) 运行方法 第一个参数是调用者第二是调用方法传递的参数Method function4 aClass.getMethod(function4, String.class);// 创建调用者Student o (Student) aClass.newInstance();System.out.println(function4.invoke(o,itzhuzhu));}
}