Java反射基础(示例)

一个反射实例

在这里插入图片描述

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()");
	}

}

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值