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