一个反射实例
package reflect.base01;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class TestReflect {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
// 创建一个clazzA对象
ClazzA clazzA = new ClazzA();
// 获取Person类对应的Class对象
Class<ClazzA> refClazz = ClazzA.class;
// 获取clazzA的名为name的成员变量
// 使用getDeclaredField()方法表明可获取各种访问控制符的成员变量
Field nameField = refClazz.getDeclaredField("name");
// 设置通过反射访问该成员变量时取消访问权限检查
nameField.setAccessible(true);
// 调用set()方法为clazzA对象的name成员变量设置值
nameField.set(clazzA , "Tom");
System.out.println(clazzA.getName());
clazzA.myname("");
// Method[] funArr = refClazz.getDeclaredMethods();
// 获取希望调用的myname方法
Method fun = refClazz.getMethod("myname" , String.class);
//执行invoke方法,第一个参数是执行方法的主调,后面是传入的实参
fun.invoke(clazzA, "123");
System.out.println(clazzA);
System.out.println(refClazz.getName());
}
}
package reflect.base01;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class TestReflect2 {
public static <T> T getInstance(Class<T> clazz) {
try {
return clazz.newInstance();
} catch (Exception e) {
// TODO: handle exception
return null;
}
}
public static void main(String[] args) throws Exception{
Tom tom = new Tom();
Class<Tom> refTom = Tom.class;
//3种方式
//1. Class<?> clazz = Class.forName("javax.swing.JFrame");
//2. Class<?> clazz = Class.forName("包名.类名");
//3. Class<?> clazz = 类.class;
// 获取Tom对应的Class对象
Tom jframeClazz = TestReflect2.getInstance(Tom.class);
// 省略以下步骤
// Constructor ctor = jframeClazz
// .getConstructor();
// // 调用Constructor的newInstance方法创建对象
// Object obj = ctor.newInstance();
//------获取单个参数的方法
tom.eat("菠萝");
// 第一个参数不对,可能会报错 java.lang.NoSuchMethodException
Method eatFun = refTom.getMethod("eat" , String.class);
//invoke第一个参数是主调
eatFun.invoke(tom, "冰淇淋");
//------多个参数的方法
Class[] par = {String.class,String.class};
//获取方法
Method med =refTom.getMethod("play", par);
Object[] arr={"五子棋","游戏"}; //参数类型要注意
//执行invoke方法
med.invoke(tom,arr);
}
}
package reflect.base01;
public class ClazzA {
public String name;
public void myname(String str) {
System.out.println("执行myname方法,参数:"+str);
}
@Override
public String toString() {
return "ClazzA [name=" + name + "]";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package reflect.base01;
public class Tom {
int age;
String familyName;
public Tom() {
}
public void eat(String foodName) {
System.out.println("吃"+foodName);
}
public void play(String name,String type) {
System.out.println("玩的是"+name+",类型是"+type);
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getFamilyName() {
return familyName;
}
public void setFamilyName(String familyName) {
this.familyName = familyName;
}
@Override
public String toString() {
return "Tom [age=" + age + ", familyName=" + familyName + "]";
}
}
反射创建JFrame
package reflect.base;
import java.lang.reflect.*;
import javax.swing.JFrame;
public class CreateJFrame
{
public static void main(String[] args)
throws Exception
{
// 获取JFrame对应的Class对象
Class<?> jframeClazz = Class.forName("javax.swing.JFrame");
// 获取JFrame中带一个字符串参数的构造器
Constructor ctor = jframeClazz
.getConstructor(String.class);
// 调用Constructor的newInstance方法创建对象
Object obj = ctor.newInstance("测试窗口");
// 输出JFrame对象
//System.out.println(obj);
//不推荐使用强转,可使用泛型
JFrame frame = (JFrame) obj;
frame.setTitle("window1");
frame.setBounds(390,390,390,390);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
package reflect.base;
import javax.swing.JFrame;
public class ReflectFactory {
public static <T> T getInstance(Class<T> clazz) {
try {
return clazz.newInstance();
} catch (Exception e) {
// TODO: handle exception
return null;
}
}
public static void main(String[] args) {
JFrame frame = ReflectFactory.getInstance(javax.swing.JFrame.class);
frame.setTitle("反射创建的JFrame");
frame.setBounds(390,390,390,390);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
反射代理
package reflect.proxy;
import java.lang.reflect.Proxy;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
// 动态代理可以让我们在运行时动态生成代理类,解耦程度更高。
// Java 动态代理的实现主要借助于 java.lang.reflect 包中的 Proxy 类与
// InvocationHandler 接口,所有对动态代理对象的方法调用都会转发到
// InvocationHandler 中的 invoke() 方法中实现。
// 一般我们称实现了 InvocationHandler 接口的类为调用处理器。
//
// 我们可以通过 Proxy 的静态工厂方法 newProxyInstance 创建动态代理类实例。
//
// public static Object newProxyInstance(ClassLoader loader,
// Class<?>[] interfaces,
// InvocationHandler h)
// loader:类加载器
// interfaces:类实现的全部接口
// h:调用处理器
IService service = new ServiceImpl();
DynamicProxy dynamicProxy = new DynamicProxy(service);
IService proxyObj = (IService) Proxy.newProxyInstance(IService.class.getClassLoader(),
new Class[] { IService.class }, dynamicProxy);
proxyObj.ser1();
}
}
package reflect.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class DynamicProxy implements InvocationHandler {
private Object target = null;
DynamicProxy(Object target) {
this.target = target;
}
/**
* @param proxy 代理对象
* @param method 调度方法
* @param args 调度方法参数
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("代理前");
method.invoke(target, args);
System.out.println("代理后");
return null;
}
}
package reflect.proxy;
public interface IService {
void ser1();
}
package reflect.proxy;
public class ServiceImpl implements IService{
@Override
public void ser1() {
// TODO Auto-generated method stub
System.out.println("ser1()");
}
}