反射

1.总结并归纳反射中四大核心类(Class、Constructor、Method、Field)的常用操作方法以及示例。

Class

a、Class类的实例化

b、利用class对象创建类的对象

c、取得类的包名称

d、取得父类的Class对象

e、取得实现的父接口

interface IFruit{

	void eat();

}

class Banana implements IFruit{

 

	@Override

	public void eat() {

		System.out.println("eat a banana");

	}	

}
class Apple implements IFruit{

 

	@Override

	public void eat() {

		System.out.println("eat a apple");

	}	

}

 

class Factory{

	private Factory() {};

	public static IFruit getInstance(String className) {

		IFruit fruit = null;

		try {

               

			Class<?> class = Class.forName(className);

			fruit = (IFruit) class.newInstance();

		} catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {

			// TODO Auto-generated catch block

			e.printStackTrace();

		}

		return fruit;

	}

}

 

public class Test {

 

	public static void main(String[] args) {

		IFruit fruit = Factory.getInstance("factorymodel.Apple");

		fruit.eat();

	}

}

Constructor

class MyClass{

	private String name;

	private Integer age;
	public Integer getAge() {

		return age;

	}

	public void setAge(Integer age) {

		this.age = age;

	}

	public MyClass(Integer age) {
		super();
		this.age = age
	}

	public MyClass(String name, Integer age) {
		super();
		this.name = name;
		this.age = age;
	}

	@Override

	public String toString() {
		return "MyClass [name=" + name + ", age=" + age + "]"
	};	
}

 

public class Test {
	public static void main(String[] args) throws Exception{
		Class<MyClass> class = MyClass.class;
		Constructor<MyClass> constructor = class.getConstructor(String.class,Integer.class);
		MyClass myClass = constructor.newInstance("zn", 18);
		Method method = class.getMethod("setAge", Integer.class);
		Method method1 = class.getMethod("getAge");
		System.out.println(method1.invoke(myClass));
		method.invoke(myClass, 10);
		System.out.println(myClass);

	}

}


2.总结反射与单级VO操作,自己实现代码并更新博客。

interface ISubject{
	void eat();
}

class RealSubject implements ISubject{
	@Override

	public void eat() {
		System.out.println("eat");
	}

}

class ProxySubject implements ISubject{
	private ISubject subject;

	public ProxySubject(ISubject subject) {
		super();
		this.subject = subject;
	}
	public void beforeEat() {
		System.out.println("pre");
	}
	public void afterEat() {
		System.out.println("aft");
	}
	@Override
	public void eat() {
		this.beforeEat();
		this.subject.eat();
		this.afterEat();

	}	

}

 


class Factory{
	@SuppressWarnings("unchecked")
	public static <T> T getInstance(String proxyClassName, String realClassName) throws Exception {
		T t = null;
		Class<?> cls = Class.forName(realClassName);

		Object obj = cls.newInstance();

		Class<?> pClass = Class.forName(proxyClassName);

		Constructor<?> constructor = pClass.getDeclaredConstructor(cls.getInterfaces()[0]);
		t = (T)constructor.newInstance(obj);
		return t;
	}

}

 

public class Test {
	public static void main(String[] args) throws Exception 
		ISubject subject = Factory.getInstance("Dmodel.ProxySubject", "Dmodel.RealSubject");
		subject.eat();
	}

}


3.总结ClassLoader类加载器的作用范围以及双亲委派模型。

class MyClass1{

	private String name;

	private Integer age;
	public Integer getAge() {

		return age;

	}

	public void setAge(Integer age) {

		this.age = age;

	}

	@Override

	public String toString() {

		return "MyClass [name=" + name + ", age=" + age + "]";

	}	

}

public class Test{
	public static void main(String[] args) throws Exception{
		Class<MyClass1> cls = MyClass1.class; 

		MyClass1 myClass = cls.newInstance();

		Field field = cls.getDeclaredField("age");

		field.setAccessible(true);
		field.set(myClass, 18);

		Object object = field.get(myClass);

		System.out.println(object);
	}

}


4.要求掌握静态代理模式原理(包括反射工厂创建)、会写出JDK提供的动态代理,知道cglib与JDK提供的动态代理之间的区别。
5.编程题:
题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?

public class Test{
	public static void main(String[] args){
		int p1=10;
		for(int i=1;i<5;i++){
			p1+=2;
		}
		System.out.println("第五个人:"+p1);
		
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值