反射和动态代理放有一定的相关性,但单纯的说动态代理是由反射机制实现的,其实是不够全面不准确的,动态代理是一种功能行为,而它的实现方法有很多。要怎么理解以上这句话,请看下文。
一、反射
反射机制是 Java 语言提供的一种基础功能,赋予程序在运行时自省(introspect,官方用语)的能力。通过反射我们可以直接操作类或者对象,比如获取某个对象的类定义,获取类声明的属性和方法,调用方法或者构造对象,甚至可以运行时修改类定义。
1、获取类(Class)对象
获取类对象有三种方法:
- 通过forName() -> 示例:Class.forName(“PeopleImpl”)
- 通过getClass() -> 示例:new PeopleImpl().getClass()
- 直接获取.class -> 示例:PeopleImpl.class
2、类的常用方法
-
getName():获取类完整方法;
-
getSuperclass():获取类的父类;
-
newInstance():创建实例对象;
-
getFields():获取当前类和父类的public修饰的所有属性;
-
getDeclaredFields():获取当前类(不包含父类)的声明的所有属性;
-
getMethod():获取当前类和父类的public修饰的所有方法;
-
getDeclaredMethods():获取当前类(不包含父类)
3、类方法调用
反射要调用类中的方法,需要通过关键方法“invoke()”实现的,方法调用也分为三种:
静态(static)方法调用
- 普通方法调用
- 私有方法调用
以下会分别演示,各种调用的实现代码,各种调用的公共代码部分,如下:
// 此段代码为公共代码
interface People {
int parentAge = 18;
public void sayHi(String name);
}
class PeopleImpl implements People {
private String privSex = "男";
public String race = "汉族";
@Override
public void sayHi(String name) {
System.out.println("hello," + name);
}
private void prvSayHi() {
System.out.println("prvSayHi~");
}
public static void getSex() {