反射是发生在程序运行期的行为
import java.util.Properties; 导入内存文件包;
通过反射方式创建对象
写法:
Person p=(Person) Class.forName(pro.getProperty(“name”)).newInstance();
p.test();
java反射机制,可以实现以下功能:
①在运行时判断任意一个对象所属的类;
②在运行时构造任意一个类的对象;
③在运行时判断任意一个类所具有的成员变量和方法;
④在运行时调用任意一个对象的方法;
⑤生成动态代理
1.在创建类型的对象的时候,获取的是类型的Class对象的一个镜像|复制体
2.在一个类加载到内存时就会存在这个类型唯一的Class对象(方法,属性,构造器...)
3.如果能够拿到一个类型的Class对象,就可以操作这个类
获取一个类型的Class对象的方式:
1.类名.class
2.对象.getClass()
3.Class.forName(报名+类名|权限定名)
Class类中常用方法(操作构造器,操作方法,操作字段)
通过反射获取字段
写法:
Field getDeclaredField(String name)
返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。
Field[] getDeclaredFields()
返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。
Field getField(String name)
返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。
Field[] getFields()
返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。
操作字段
设置值 void set(Object obj, Object value)将指定对象变量上此 Field 对象表示的字段设置为指定的新值。
获取值 Object get(Object obj)返回指定对象上此 Field 表示的字段的值。
私有属性–放开权限
money.setAccessible(true); 开发权限
money.setAccessible(false);关闭权限
通过字段对象,和Class对象获取这个字段的公共的设置器|访问器
cls.getMethod("", parameterTypes);
}
通过反射获取方法:
Method getDeclaredMethod(String name, Class<?>… parameterTypes)
返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法。
Method[] getDeclaredMethods()
返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。
Method getMethod(String name, Class<?>… parameterTypes)
返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。
Method[] getMethods()
返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法。
通过反射执行方法:
Object invoke(Object obj, Object… args) 返回值:调用执行的方法的返回值
obj调用当前成员方法的对象
可变参数args 方法的实参
静态方法调用,第一个参数 (对象|null)
method.invoke(obj);
method.invoke(null);
method.setAccessible(false)
通过反射获取类中构造器:
* Constructor getConstructor(Class<?>… parameterTypes)
返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。
Constructor<?>[] getConstructors()
返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法。
Constructor getDeclaredConstructor(Class<?>… parameterTypes)
返回一个 Constructor 对象,该对象反映此 Class 对象所表示的类或接口的指定构造方法。
Constructor<?>[] getDeclaredConstructors()
返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法。
通过反射创建对象:
1.Constructor->newInstance(参数的class对象...)
2.Class类中newInstance()
不能通过私有的构造器创建对象,setAccessible(boolean)设置权限,true->放开权限 false->关闭权限
Class->newInstance()
Object obj=cls.newInstance(); //默认调用空构造
System.out.println(obj);
class对象:当一个类加载到内存时,会创建一个当前类的class对象,再之后new拿到的都是class对象的副本.
Class对象是反射的源头
所有类都是class类的实例(也就是class类的对象,也叫class对象的副本)
class类是模板
如果能拿到一个类型的class对象,就可以操作这个类,通过子类的class对象获取父类的class对象.
构造器可以不写修饰符
以上都是运行时异常
通过反射获取对象,获取class对象
java匿名内部类与Lambda表达式
1 首先定义一个接口
2 定义一个实现类来实现我们定义的接口(重写接口的方法)
3 此时我们可以用这个实现类来创建一个实例(也就是对象),然后通过这个对象来调用这个重写的方法,但是我们只在调用这个重写方法的时候来使用这个方法,也就是说我们只使用这个方法一次,而就要为这个抽象的方法来定义一个实现类,这时候我们new一个对象的时候就造成了这个对象引用的浪费所有我们就可以通过匿名内部类来调用这个方法:
在new对象的时候我们可以不用引用来直接写 new Ipm().run();(这里的匿名内部类调用了run方法)
匿名内部类的作用是:
简化冗(rong)长的实现类
implements:实现接口的关键字