上一篇博客[java中反射与代理的关系,动态代理InvocationHandler和Proxy的实现与剖析]主要讲解代理模式,对于反射的使用只是简单说一下,本文主要对反射进行补充完善。
jdk中提供了三种方式来获取类Class,我们来逐一讲解和使用下:
目录
1,通过类的名称,全限定名获取类Class信息
简单实现如下:
//MainTestClassService.java
package com.lzm.service;
public interface MainTestClassService {
public void MainHelloTest();
}
//MainTestClassServiceImpl.java
package com.lzm.controller;
import com.lzm.service.MainTestClassService;
public class MainTestClassServiceImpl implements MainTestClassService{
@Override
public void MainHelloTest() {
System.out.println("你好,我是小明");
}
}
//ReflectionApplication.java
package com.lzm.reflection;
import com.lzm.controller.MainTestClassServiceImpl;
import com.lzm.service.MainTestClassService;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class ReflectionApplication {
public static void main(String[] args) {
try {
Class<?> clazz = Class.forName("com.lzm.controller.MainTestClassServiceImpl");
System.out.println("通过反射,实例化对象,获取方法");
Object obj = clazz.newInstance();
MainTestClassService mtcs = (MainTestClassService)obj;
mtcs.MainHelloTest();
System.out.println("通过Method获取方法");
Method method = obj.getClass().getDeclaredMethod("MainHelloTest");
method.invoke(obj,null);
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行结果:
1.1 实例化对象并调用方法的方式
1.2 反射并构建实例化对象的过程分析
既然要了解反射,那么获取相应的class对象信息根据构造方法并将其转化为实例化对象,根据实例化后的对象调用方法,有两种实现方式。
2,通过类名获取类Class信息
简单实现如下,接口和实现类延用上述内容:
//ReflectionApplication.java
package com.lzm.reflection;
import com.lzm.controller.MainTestClassServiceImpl;
import com.lzm.service.MainTestClassService;
import sun.misc.Unsafe;
import sun.reflect.CallerSensitive;
import sun.reflect.Reflection;
import java.lang.reflect.*;
public class ReflectionApplication {
public static void main(String[] args) {
try {
Class<?> clazz = MainTestClassServiceImpl.class;
Object obj = clazz.newInstance();
Method method = clazz.getDeclaredMethod("MainHelloTest");
// Method method = obj.getClass().getDeclaredMethod("MainHelloTest");
method.invoke(obj,null);
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行结果:
3,通过实例化类对象获取类Class信息
简单实现如下,接口和实现类延用上述内容:
//ReflectionApplication.java
package com.lzm.reflection;
import com.lzm.controller.MainTestClassServiceImpl;
import com.lzm.service.MainTestClassService;
import sun.misc.Unsafe;
import sun.reflect.CallerSensitive;
import sun.reflect.Reflection;
import java.lang.reflect.*;
public class ReflectionApplication {
public static void main(String[] args) {
try {
MainTestClassService mtcs = new MainTestClassServiceImpl();
Class<?> clazz = mtcs.getClass();
Method method = clazz.getDeclaredMethod("MainHelloTest");
Object obj = clazz.newInstance();
method.invoke(obj , null);
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行结果:
总结:
本文从JDK提供的三种反射方式,对通过反射实例化对象并调用其方法进行了实现和剖析,但是,我还是没有自己写底层的反射,我决定再拖一拖!