Java反射机制详解(1) -反射定义

时间:2023-03-08 16:14:18

首先,我们在开始前提出一个问题:

1.在运行时,对于一个java类,能否知道属性和方法;能否去调用它的任意方法? 答案是肯定的。

本节所有目录如下:

    1. 什么是JAVA的反射机制
    2. JDK中提供的Reflection API
    3. JAVA反射机制提供了什么功能
      • 获取类的Class对象
      • 获取类的Fields
      • 获取类的Method
      • 获取类的Constructor
      • 新建类的实例
               Class<T>的函数newInstance
               通过Constructor对象的方法newInstance
    4. 调用类的函数
               调用private函数
    5. 设置/获取类的属性值
               private属性
    6. 动态创建代理类
               动态代理源码分析
    7. JAVA反射Class<T>类型源代码分析
    8. JAVA反射原理分析
              Class文件结构
              JVM加载类对象,对反射的支持
    9. JAVA反射的应用

一、什么是JAVA的反射机制

Java
反射是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过Reflection
APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public, static
等)、superclass(例如Object)、实现之interfaces(例如Cloneable),也包括fields和methods的所有信
息,并可于运行时改变fields内容或唤起methods。

Java反射机制容许程序在运行时加载、探知、使用编译期间完全未知的classes。

换言之,Java可以加载一个运行时才得知名称的class,获得其完整结构。

二、JDK中提供的Reflection API

Java反射相关的API在包java.lang.reflect中,JDK 1.6.0的reflect包如下图:

aaarticlea/png;base64,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*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" alt="" />

Member接口 该接口可以获取有关类成员(域或者方法)后者构造函数的信息。
AccessibleObject类 该类是域(field)对象、方法(method)对象、构造函数(constructor)对象的基础类。它提供了将反射的对象标记为在使用时取消默认 Java 语言访问控制检查的能力。
Array类 该类提供动态地生成和访问JAVA数组的方法。
Constructor类 提供一个类的构造函数的信息以及访问类的构造函数的接口。
Field类 提供一个类的域的信息以及访问类的域的接口。
Method类 提供一个类的方法的信息以及访问类的方法的接口。
Modifier类 提供了 static 方法和常量,对类和成员访问修饰符进行解码。
Proxy类

提供动态地生成代理类和类实例的静态方法。

三、JAVA反射机制提供了什么功能

Java反射机制提供如下功能:

在运行时判断任意一个对象所属的类

在运行时构造任意一个类的对象

在运行时判段任意一个类所具有的成员变量和方法

在运行时调用任一个对象的方法

在运行时创建新类对象

在使用Java的反射功能时,基本首先都要获取类的Class对象,再通过Class对象获取其他的对象。

这里首先定义用于测试的类:

class Type {
public int pubIntField;
public String pubStringField;
private int prvIntField; public Type() {
Log("Default Constructor");
} Type(int arg1, String arg2) {
pubIntField = arg1;
pubStringField = arg2; Log("Constructor with parameters");
} public void setIntField(int val) {
this.prvIntField = val;
} public int getIntField() {
return prvIntField;
} private void Log(String msg) {
System.out.println("Type:" + msg);
}
} class ExtendType extends Type {
public int pubIntExtendField;
public String pubStringExtendField;
private int prvIntExtendField; public ExtendType() {
Log("Default Constructor");
} ExtendType(int arg1, String arg2) {
pubIntExtendField = arg1;
pubStringExtendField = arg2; Log("Constructor with parameters");
} public void setIntExtendField(int field7) {
this.prvIntExtendField = field7;
} public int getIntExtendField() {
return prvIntExtendField;
} private void Log(String msg) {
System.out.println("ExtendType:" + msg);
}
}

1、获取类的Class对象

Class 类的实例表示正在运行的 Java 应用程序中的类和接口。获取类的Class对象有多种方式:

调用getClass

Boolean var1 = true;

Class<?> classType2 = var1.getClass();

System.out.println(classType2);

输出:class java.lang.Boolean

运用.class 语法

Class<?> classType4 = Boolean.class;

System.out.println(classType4);

输出:class java.lang.Boolean

运用static method Class.forName()

Class<?> classType5 = Class.forName("java.lang.Boolean");

System.out.println(classType5);

输出:class java.lang.Boolean

运用primitive wrapper classes的TYPE 语法

这里返回的是原生类型,和Boolean.class返回的不同

Class<?> classType3 = Boolean.TYPE;

System.out.println(classType3);

输出:boolean

2、获取类的Fields

可以通过反射机制得到某个类的某个属性,然后改变对应于这个类的某个实例的该属性值。JAVA 的Class<T>类提供了几个方法获取类的属性。

public FieldgetField(String name) 返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段
public Field[] getFields() 返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段
public FieldgetDeclaredField(Stringname) 返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段
public Field[] getDeclaredFields()

返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段

import java.lang.reflect.Field;

public class test {
public static void main(String[] args) { Class<?> classType = ExtendType.class;
// 使用getFields获取属性
Field[] fields = classType.getFields();
for (Field f : fields)
{
System.out.println(f);
}
System.out.println();
// 使用getDeclaredFields获取属性
fields = classType.getDeclaredFields();
for (Field f : fields)
{
System.out.println(f);
}
} }
public int ExtendType.pubIntExtendField
public java.lang.String ExtendType.pubStringExtendField
public int Type.pubIntField
public java.lang.String Type.pubStringField public int ExtendType.pubIntExtendField
public java.lang.String ExtendType.pubStringExtendField
private int ExtendType.prvIntExtendField

可见getFields和getDeclaredFields区别:

getFields返回的是申明为public的属性,包括父类中定义,

getDeclaredFields返回的是指定类定义的所有定义的属性,不包括父类的。

3、获取类的Method

通过反射机制得到某个类的某个方法,然后调用对应于这个类的某个实例的该方法

Class<T>类提供了几个方法获取类的方法。

public MethodgetMethod(String name,Class<?>... parameterTypes)

返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法

public Method[] getMethods()

返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法

public MethodgetDeclaredMethod(Stringname,Class<?>... parameterTypes)

返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法

public Method[] getDeclaredMethods()

返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法

import java.lang.reflect.Method;

public class test {
public static void main(String[] args) { // 使用getMethods获取函数
Class<?> classType = ExtendType.class;
Method[] methods = classType.getMethods();
for (Method m : methods)
{
System.out.println(m);
} System.out.println(); // 使用getDeclaredMethods获取函数
methods = classType.getDeclaredMethods();
for (Method m : methods)
{
System.out.println(m);
}
} }

结果

public void ExtendType.setIntExtendField(int)
public int ExtendType.getIntExtendField()
public void Type.setIntField(int)
public int Type.getIntField()
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll() private void ExtendType.Log(java.lang.String)
public void ExtendType.setIntExtendField(int)
public int ExtendType.getIntExtendField()

1.都不包括构造函数

2.

可见getMethods和getDeclaredMethods区别:

getMethods返回的是申明为public的属性,包括父类中定义,Oject继承的方法也有

getDeclaredMethods返回的是指定类定义的所有定义的属性,不包括父类的。

4、获取类的Constructor

通过反射机制得到某个类的构造器,然后调用该构造器创建该类的一个实例

Class<T>类提供了几个方法获取类的构造器。

public Constructor<T> getConstructor(Class<?>... parameterTypes)

返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法

public Constructor<?>[] getConstructors()

返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法

public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)

返回一个 Constructor 对象,该对象反映此 Class 对象所表示的类或接口的指定构造方法

public Constructor<?>[] getDeclaredConstructors()

返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法。它们是公共、保护、默认(包)访问和私有构造方法

import java.lang.reflect.Constructor;

public class test {
public static void main(String[] args) { // 使用getConstructors获取构造器
Class<?> classType = ExtendType.class;
Constructor<?>[] constructors = classType.getConstructors();
for (Constructor<?> m : constructors)
{
System.out.println(m);
} System.out.println(); // 使用getDeclaredConstructors获取构造器
constructors = classType.getDeclaredConstructors();
for (Constructor<?> m : constructors)
{
System.out.println(m);
} } }

结果

public ExtendType()

public ExtendType()
ExtendType(int,java.lang.String)

只有自己的构造函数哦

5、新建类的实例

通过反射机制创建新类的实例,有几种方法可以创建

调用无自变量ctor

1、调用类的Class对象的newInstance方法,该方法会调用对象的默认构造器,如果没有默认构造器,会调用失败.

Class<?> classType = ExtendType.class;

Object inst = classType.newInstance();

System.out.println(inst);

输出:

Type:Default Constructor
ExtendType:Default Constructor
ExtendType@133c5982

2、调用默认Constructor对象的newInstance方法

Class<?> classType = ExtendType.class;

Constructor<?> constructor1 = classType.getConstructor();

Object inst = constructor1.newInstance();

System.out.println(inst);

输出:

Type:Default Constructor
ExtendType:Default Constructor
ExtendType@133c5982

调用带参数ctor

3、调用带参数Constructor对象的newInstance方法

Constructor<?> constructor2 =

classType.getDeclaredConstructor(int.class, String.class);

Object inst = constructor2.newInstance(1, "123");

System.out.println(inst);

输出:

Type:Default Constructor
ExtendType:Constructor with parameters
ExtendType@5f186fab

//ExtendType inst = (ExtendType) constructor2.newInstance(1, "123"); //直接就一实例

使用Class.forName
Class<?> classType=Class.forName("ExtendType");//更能体现动态代理的意思

6、调用类的函数

通过反射获取类Method对象,调用Field的Invoke方法调用函数。

import java.lang.reflect.Constructor;
import java.lang.reflect.Method; public class test {
public static void main(String[] args) throws Exception, IllegalAccessException { Class<?> classType = ExtendType.class;
Object inst = classType.newInstance();
Method logMethod = classType.getDeclaredMethod("Log", String.class);
logMethod.invoke(inst, "test");
} }

结果

aaarticlea/png;base64,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" alt="" />

上面失败是由于没有权限调用private函数,这里需要设置Accessible为true;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method; public class test {
public static void main(String[] args) throws Exception, IllegalAccessException { Class<?> classType = ExtendType.class;
Object inst = classType.newInstance();
Method logMethod = classType.getDeclaredMethod("Log", String.class);
logMethod.setAccessible(true);
logMethod.invoke(inst, "test");
} }

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQQAAABLCAIAAAAZE25QAAAG6UlEQVR4nO2ay8GqMBCFaYqN1bCiFNaW8O/ZU4YN2AQd3LsgwDzzUFCQ8600kNdkTjLRqcZx/Pv7Gz/Po6urunvs2UXf7N3DtembqunH95byA26QTTVCDLvx6OrJW8axb6qJ9bs3tPBqeHG/WTy6mvTyCl8TQzCRW2+xtpigNiUryRcDWdmvUTiGYjd6YY5+lUdXh94fXU00ET6uj/WoEyu4CY+uruv3llSOtKTvt33JM0vfMAn0DX1LGR1i2Kr9aBXbU+iQHF/6jBgmt3jZncdxPKQYyG7j9cxq5YthPUjJuRPqriVzY9MM+yYU9U1Vd31XL4fVXGPdLsOw+6aqu44/nXsnZ13OGPhr9EH6OM5qnw9KV3GtbtjeORtiYpA2YbNav8jXNHPfckDzCrK6XjkNk2hUx00SX0enrgwTtXuYYvA2Dm4aYpO0GObhs3ZpK3J9FpNUYmLTW9Mcpyfs9UUM9Ok86IbsoLKyNwa2MfSNMYWYhyTbN3Y0b5PjLv0gm4L3jle6DsSyCX26WNYwnepjFbyQGjEAMbtVrsWgTJ5cR68u60W7x8tiEPaNi8G9Vlm3QbYHRDRnfRYnw7oe/tmQHIOwRcw0r81xKhVRqNWUv+snj4Z4mKRsou1pvia7sNZGzMXYt3i5EoNj8Ng6unXNB8RiRWKQL9m/TkRPBmZH7ihGl5uK4dHVRkCVGkNCDCUnQ8ysUzvmsUv79q4SiUuDKOWz1zYJLbLruvUa70GgD95xGzEk1zEmhiWuyBZDthpM/WfeGUQ1EY2YpnxPDGK8dpikx0AL6Tpk/oSXav/RddIaETGQCdAx6eBO1RSepyMauTJ101heYh+BMnZavqv1pio0yu0waTFgx89qex0jYZIdyMXFIFZ9HKdfk8Tqk2bo3Ar+Zwj7qntF2zZMWjuom4aZLjYGfn/rin+HSbZv3y5F6DS/udSygxbn8FiKQ19W7ENtonzee41MQd1d1itRo2bollsX6LVzet/w15F5jX+BzhaD3YzcClmAur4+futPt5/HuTYkH3sB1v54p5xX/lWyAiIXc0oQw45EnCi9r33B+04jhmCiN8Rg7jkQA1g4jRh2AmIAIAAxABBgYvgD4MIwMfwD4MJADAAEIAYAAucSw/N+C/8V3u7PoppDGyq2w05jA6fHEMPqcdWLnpfL4qGZXjq07w3leb+JbnRJrPOt7VHQ+1fbvAqRk2Fo97Yqce7n/ZbUw9vr/LIYcka3yXiO2eZVyBXD834jG+LybWir9j6fJPy5teEPLSthOz3pQVVXh1Vogx4tc7Nk2NIx2HfVpr/few5mTDNtkKnQ653VD626MyLTb4fIjKzlsDq6Ovkng9jGl3WiDju9QCvyyCYmhuWbWz226bEhZYkh2SR7SSuFlrK5Ex8movXEJMqHdvXhuZY9I9J8tE17nGZHV6cgTFoc83m/WWacl0FuUP6Oa4rBr+74jjgbPiQGUTPuuGFOsid7Qmo8Zpve/Skx56UtCEBTcmcIIhA7txJD/jXX3Pf96sp3vMNqYzGYm3CRGEg7tCWI4ViUXaCH9na/02LyzuoxzgH+LxYm2eEFx1pncuhLL5m247gYMpVrXaDdMMkXgyrUvTti0DNy7/SyTT9MghgEhb8mCW9mYQpZAhrq0JXRYjBfc6p7W21VVVSjS21SKGMvvjunwjlvrGvZUtcUA+tdBfSsBdNHrRmJZkklPSNjnBCDQeGfbnLbgUnB71AkBh3AQAzgd8gVw3TSqkgCYgC/w7lykwDYEYgBgADEAEDgMGI4QYIZEsh/HFsMLMshsYIbebGXzIEE8rnzre2BnFmJK4bsKW0shleG8BpIIIcYONliYH8eh5THkpzhdG5z5YsBCeROzmuxkZFAHiEjTKKpBkYqnZkkQWcdyW0m/+IlTgYkkPulSCDfiLIwyUpFNuevdwjLptTZUmESEsgjNZFAvgnFYrjdDN+33ZbxrhiQQB6piQTyTSgRA9k8RSoqN4x5hFo2XVvS6dbmtQUJ5EbvSCDfiuyfVmmU97zf7PuZcWcypq9P8KpqB31JsNYFCeRIIN+Nw/zploPcdo5pUnBWTiQGHcBADGBLziGGAQnkYH/OIQYAPgDEAEAAYgAgcBgxnDvFC/wCF07hpr1+pzo4FhdO4bZ6/Wx1cCyum8JdlHKcnwUNzsuFU7gLBl+QBQ3Oy4VTuAsGX5AFDc7LhVO4CwZPnqrgCWL4GS6cwl0weEIqCxqclwuncBcMviALGpyXw/zplgNSuMGenEgMSOEG+3IOMSCFG3yAc4gBgA8AMQAQgBgACEAMAAQgBgACEAMAAYgBgADEAEAAYgAgADEAEIAYAAhADAAEIAYAAhADAIH/tdxBMqWJDEYAAAAASUVORK5CYII=" alt="" />

7、设置/获取类的属性值

通过反射获取类的Field对象,调用Field方法设置或获取值

import java.lang.reflect.Field;

public class test {
public static void main(String[] args) throws Exception, IllegalAccessException { Class<?> classType = ExtendType.class;
Object inst = classType.newInstance();
Field intField = classType.getField("pubIntExtendField");
intField.setInt(inst, 100);
int value = intField.getInt(inst);
System.out.println(value);
} }

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPMAAABXCAIAAABeGeSQAAAG0UlEQVR4nO2buaGrMBBFqYqAaohohZQSfu6cMmjATdABP2CbVWK1jd490bNA2+gyGsG8bBiGvu/7vv/3718/Q//+U/zZiUd5nGUyKJvyZyce5XGWcZUNwKOBzwZpAmWDNIGyQZpA2SBNoGyQJr+k7K7Os7zu7uziVd7dw9/mVWblqz+3lBfJAMr+KF2dj0vf968yG1l/e0Obbp1uvG8WXZ2TXo7wNWVPJiL1ziibLNPX2DmG3Zo4MEe/SlfnU+9dnROBT3+ul/WoWYM3Kbur8zw/t6RypHv6Pq0lbhYo+9L2g1XsZadDcoTxGWWPD9ZhbfZ9/2Rlr/vVspkuW8BaMrc/DvdVTkWvMsvrV50vW+tcY3Vk0+xeZZbXNb8690628C1j4LfRC/Fdb1P7fFC6CrWd0R1bDsdrh5QtbcJmtf6Qt2nmvuWA5hVkdb1yGo3Q4ImbJLyOTl0ZjWl5HFL2PBZmdzoEaexlfpkY5XjXOODxCrt9UTa9Oi9OSXybrOyNgez24w81hdByR9s3fI3nfrg+O/KEe/d4petALJvQq4tlDdOpPtanVzw3xADE7Fa5VrYyeXQdvbqsFy2PA8p2zxXWcYg9nWKNxb6r/hY+ezWu77WjYxAbt7ePH5/jWEobdZTt++Oo0w5HI8om2p7mbbILa23EXAwnxMuVsh2Dh9bRrWteIBY75bOZUfiqGxO4VNldnRtxS2wMEWXv8dmh6HZsZ934t0TLjlniPpvPXttkapGdV63beA8CvSX21yg7uo4hZS87/mXKZsPiwdZqGrLpm3Y5p2zhSexoRI+BFlKjbny7FGu/q2tpjYCyyQTomHQMpWoKGenAQa5MXpbWktubkwxRlt9qvekjZZTb0chiwJrvovY6BqIRO166RNmcyeO5Z5Rro5G1g7wsmR1CY+AHmHr3W4Vo+/bxSkQo851LLTs2iL0bmfqyQgxqEyVg7zYyBRXvr8eIUs3QLbdOkGvnNEb313HjCfJWZYN9OKF29LIXx9yPt/945V8Fyv4iAUUEwnjlqj/GY5Q9mQjKBtt4jLI1UDZIEygbpElE2Xf9+yUANxNR9gDAM4GyQZpA2SBNnq7sd1NMX6iK5r2rZltNFav2prGBb7JJ2at8soMy2soit42Sa6tzQ3k3hehGl4Q6v9oeO3r/apsPYJfPbqu7TUSU+m6KqLhPL9phZW8Z3SXj+c02H8BxZb+bgriq5VdbZVUz+3h+3XLFbcVKmA8mPajqahuZ2qBOf26WDFuuMvut2vQ9sacWY5pxg4yFXu+s/tSqOyMy/aoNzMhaDqujB3PGZwsHuxidqm+8gVbkAURI2csvt3rIHbEhbVJ2tEl2k5Y9LWVzJ4IkT6D3ZIjytloFOdeyZ0SaD7Zpj9Ps6MGcikYWlb2bwrLJbFPpOnxfaCrbr+4IQXjtDylb1AyrcJqT7MmekBqP2aZ35ojMeWkrATVTzsXZk6KFT1XK3n7OMz2yX10JwdtGLla26R53KZu0Q1uCsi/j7AmyrYqmocXknnX5nX1yCEUj9i7OsRaN7K1yyUdHGVb2xsfQOkG60YivbFWoe3eUrWfkHmplm340AmXzsky4ACvqoBEFNbNWtnmbU91zglmW0QduqU0KZYjD/WYsavLGupYtdU1ls95VEMxaMAVnzUg0SyrpGRnj/NPKtpAOITH7gKdyUtk6ToCywU9wXNnjhqY2bCgb/ARPzxsBwAbKBmkCZYM0+WFlPyCTBzm0v8tWZbOP1pHluEiS3rd55NDOnV9tj6QyDXcoe/P4Llb2kSEcAzm0UPZUxHI1s6J570mbjKd3Zr6ykUPrZAruNnKqObSHohH65djIWTK/edMpBNI7yaefiM9GDq1fihza89GIlY1pTkY/u5aBqHJi0QhyaAM1kUN7gbKLwhCyrUHGWWUjhzZQEzm055RN3JpI4OOzNHcqy0BrSzrj1Az1kUNr9I4c2uHUWz8aGb2bwj6gGIcGYy56o8yyqtWBtWVk5NAih9bih7/UbEE6hPvfDIKH8Ghl6zgBygYTT1V2ixxaEOSpygYgDJQN0gTKBmkCZYM02a5s7zt64OXxXdmmAETZqOzxvbH+Mkq/Rqgvdl9LYARgXzTifopdP7OahQB8nOPKpllM42dW6tVp4WdnBMAwnFf2EnzQeEUUfnZGAAzD2WiEZzxN0YguBODjnFC2TPpUebp+9igAd7P93YiVdYm3fuBXwZcakCZQNkgTKBukCZQN0gTKBmkCZYM0gbJBmkDZIE2gbJAmUDZIEygbpAmUDdIEygZpAmWDNIGyQZpA2SBNoGyQJlA2SBMoG6QJlA3SBMoGafIfAj1lQPEQmUwAAAAASUVORK5CYII=" alt="" />

四、动态创建代理类

代理模式

代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。Spring 中常常使用Proxy,是为了在真实目标类上,加入一些其它操作,而这些操作的细节都交给代理处理,你只需要集中目标类功能的实现。

 

主要用来做方法的增强,让你可以在不修改源码的情况下,增强一些方法,在方法执行前后做任何你想做的事情(甚至根本不去执行这个方法),因为在InvocationHandler的invoke方法中,你可以直接获取正在调用方法对应的Method对象,具体应用的话,比如可以添加调用日志,做事务控制等。

还有一个有趣的作用是可以用作远程调用,比如现在有Java接口,这个接口的实现部署在其它服务器上,在编写客户端代码的时候,没办法直接调用接口方法,因为接口是不能直接生成对象的,这个时候就可以考虑代理模式(动态代理)了,通过Proxy.newProxyInstance代理一个该接口对应的InvocationHandler对象,然后在InvocationHandler的invoke方法内封装通讯细节就可以了。具体的应用,最经典的当然是Java标准库的RMI,其它比如hessian,各种webservice框架中的远程调用,大致都是这么实现的。

动态代理的主要作用就是:实现了日志和业务的分开,也就是某个类只是要提供了某些业务,比如银行取款业务。 
这个类实现了取款业务的同时也需要实现日志功能,如果不用动态代理的话,那么由此一来该类代码里面已经额外地添加了自己不该添加的日志功能能代码。所以我
们就得使用动态代理把它的业务代码和日志功能代码分开。所以用到了动态代理概念,spring里面的AOP就是一个很好的例子。

代理模式:代理模式的作用=为其他对象提供一种代理以控制对这个对象的访问。

代理模式的角色:

抽象角色:声明真实对象和代理对象的共同接口

代理角色:代理角色内部包含有真实对象的引用,从而可以操作真实对象。

真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。

动态代理:

java.lang.reflect.Proxy

Proxy 提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类

InvocationHandler

是代理实例的调用处理程序 实现的接口,每个代理实例都具有一个关联的调用处理程序。对代理实例调用方法时,将对方法调用进行编码并将其指派到它的调用处理程序的 invoke 方法。

动态Proxy是这样的一种类:

它是在运行生成的类,在生成时你必须提供一组Interface给它,然后该class就宣称它实现了这些interface。你可以把该class的实例当作这些interface中的任何一个来用。当然,这个Dynamic Proxy其实就是一个Proxy,它不会替你作实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作。

在使用动态代理类时,我们必须实现InvocationHandler接口

步骤:

1、定义抽象角色

package proxy;
public interface Subject {
public void Request(int a);
}

2、定义真实角色

package proxy;
public class RealSubject implements Subject {
@Override
public void Request(int a) {
System.out.println("RealSubject:"+a);
}
}

3、定义代理角色

package proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method; public class DynamicSubject implements InvocationHandler {

//代理角色:代理角色内部包含有真实对象的引用,从而可以操作真实对象。 
private Object sub;
public DynamicSubject(Object obj) {
this.sub = obj;
} @Override
public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {
System.out.println("Method:" + method + ",Args:" + args);
method.invoke(sub, args);
return null; } }

4、通过Proxy.newProxyInstance构建代理对象

5、通过调用代理对象的方法去调用真实角色的方法

package proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy; public class test { /**
* @param args
*/
public static void main(String[] args) { RealSubject realSub = new RealSubject();
InvocationHandler handler = new DynamicSubject(realSub);////代理角色:代理角色内部包含有真实对象的引用,从而可以操作真实对象。
Class<?> classType = handler.getClass();
Subject sub = (Subject)Proxy.newProxyInstance(classType.getClassLoader(),
realSub.getClass().getInterfaces(),
handler);
System.out.println(sub.getClass());
//5、通过调用代理对象的方法去调用真实角色的方法
         sub.Request(111); } }

输出

class com.sun.proxy.$Proxy0   新建的代理对象,它实现指定的接口
Method:public abstract void proxy.Subject.Request(),Args:null
RealSubject  调用的真实对象的方法


上面没有怎么描述Class.forName这个方法,下面补充一点

使用 Class.forName反射

1.使用Class.forName

        Class<?> classType=Class.forName("ExtendType");
Object inst = classType.newInstance();
Field intField = classType.getField("pubIntExtendField");
intField.setInt(inst, 100);
int value = intField.getInt(inst);
System.out.println(value);

aaarticlea/png;base64,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" alt="" />