DAY14

1.反射:

2.class类:

public class Test {
	public static void main(String[] args) {
		Person p = new Person();
		Class clazz = p.getClass();//clazz对象中包含了Person类所有信息
		
		Class c0 = Person.class;//通过类名.class创建指定类的class实例
		
		Class c1 = p.getClass();//通过实例的getclass()方法,获取对应实例对象的类的Class实例
		
		try {
			Class c2 = Class.forName("day14.Person");//通过Class的静态方法forName获取一个类的实例
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
}

在这里插入图片描述

3.反射获取一个类的父类和接口:

public class Test1 {
	public static void main(String[] args) {
		try {
			Class clazz = Class.forName("day14.Student");
			
			Class superClazz = clazz.getSuperclass();//获取父类
			System.out.println(superClazz.getName());
			
			Class[] interfaces = clazz.getInterfaces();//获取所有接口
			for(Class c:interfaces) {
				System.out.println(c.getName());
			}
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
}

4.反射获取全部构造器:

import java.lang.reflect.Constructor;

public class Test1 {
	public static void main(String[] args) {
		try {
			Class clazz = Class.forName("day14.Student");
			
			Class superClazz = clazz.getSuperclass();//获取父类
			System.out.println(superClazz.getName());
			
			Class[] interfaces = clazz.getInterfaces();//获取所有接口
			for(Class c:interfaces) {
				System.out.println(c.getName());
			}
			Constructor[] cons = clazz.getConstructors();
			for(Constructor c: cons) {
				System.out.println(c.getName()+" "+c.getModifiers());
				
				
			}
			Constructor[] cons1 = clazz.getDeclaredConstructors();
			for(Constructor c: cons1) {
				System.out.println(c.getName()+" "+c.getModifiers());
				Class[] paramClazz = c.getParameterTypes();
				for(Class pc : paramClazz) {
					System.out.println("构造方法:" + pc.getName());
				}
			}
			//返回1表示public,返回2表示返回private
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
}

5.通过反射创建一个对象:

			//用反射来创建对象
			try {
				Object obj = clazz.newInstance();
				Student stu = (Student)obj;
				System.out.println(stu.school);
			} catch (Exception e) {
				e.printStackTrace();
			}

6.反射获取类的方法:

			Method[] ms = clazz.getMethods();//获取到公有方法
			for(Method m : ms) {
				System.out.println("方法名:" + m.getName());
			}
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}

7.反射获取类属性和包:

//			Field[] fs = clazz.getFields();//获取公有属性
			Field[] fs = clazz.getDeclaredFields();//获取全部属性,包括私有
			
			for(Field f : fs) {
				System.out.println("修饰符"+f.getModifiers());
				System.out.println(f.getType());
				
			}

8.反射机制调用指定方法:

			Method m = clazz.getMethod("setInfo", String.class,String.class);
			Constructor con = clazz.getConstructor();
			Object obj = con.newInstance();
			m.invoke(obj, "zhangsan","第一中学");
			//如果想调用一个私有方法
			Method m1 = clazz.getDeclaredMethod("test", String.class);//获取方法名为test,参数为一个String类型的
			/**
			 * 注意:下面不论是反射调用setInfo还是test方法
			 * 都调用的obj对象的方法,obj对象时间上就是student对象
			 */
			m1.setAccessible(true);//解除私有的封装
			m1.invoke(obj, "李四");

9.反射机制调用指定属性:

			/*
			 * 反射创建对象
			 */
			Constructor con = clazz.getConstructor();
			Student stu = (Student)con.newInstance();
			
			Field f = clazz.getField("school");
			f.set(stu, "第三中学");
			String school = (String)f.get(stu);
			System.out.println(school);
			f.setAccessible(true);//解除私有封装

10.Java动态代理:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
 * 动态代理类
 * @author Daniel
 *
 */
public class ProxyDemo implements InvocationHandler{
	Object obj;//被代理的对象
	
	public ProxyDemo(Object obj) {
		this.obj = obj;
	}
	
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		System.out.println(method.getName() + "is starting");
		Object result = method.invoke(this.obj, args);
		System.out.println(method.getName() + "is ok");
		
		return result;
	}

}
public class TestDemoImpl implements ITestDemo {

	@Override
	public void test1() {
		System.out.println("test1");
	}

	@Override
	public void test2() {
		System.out.println("test2");
	}

}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

public class Test2 {
	public static void main(String[] args) {
		ITestDemo test = new TestDemoImpl();
		
		test.test1();
		System.out.println("========================================");
		test.test2();
		InvocationHandler handler = new ProxyDemo(test);
		/**
		 * 参数1代理对象的类加载器
		 * 参数2被代理的对象的接口
		 * 参数3代理对象
		 * 
		 * 返回的值就是成功被代理后的对象
		 */
		ITestDemo t = (ITestDemo)(Proxy.newProxyInstance(handler.getClass().getClassLoader(), test.getClass().getInterfaces(), handler));
		
		t.test1();
		System.out.println("======================================");
		t.test2();
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值