Interface : Person
package java_.lang_.component.bean; public interface Person { String area = "earth"; public void userAxe(); public void personLaught(); }
Class : Teacher
package java_.lang_.component.bean.impl; import java_.lang_.component.bean.Person; public class Teacher { private String subject; private Person[] sudents; public String getSubject() { return subject; } public void setSubject(String subject) { this.subject = subject; } public Person[] getSudents() { return sudents; } public void setSudents(Person[] sudents) { this.sudents = sudents; } }
Class : Chinese
package java_.lang_.component.bean.impl; import java_.lang_.component.bean.Axe; import java_.lang_.component.bean.Person; public class Chinese extends Teacher implements Person { private String name; private Axe axe; public String commonPro; public Chinese(String name, Axe axe) { super(); this.name = name; this.axe = axe; } public String getCommonPro() { return commonPro; } public void setCommonPro(String commonPro) { this.commonPro = commonPro; } public Chinese() { super(); // TODO Auto-generated constructor stub } @Override public String toString() { return "Chinese [name=" + name + ", axe=" + axe + "]"; } @Override public void userAxe() { System.out.println(name + " 说 : " + axe.chop()); } public String getName() { return name; } public void setName(String name) { this.name = name; } public Axe getAxe() { return axe; } public void setAxe(Axe axe) { this.axe = axe; } @Override public void personLaught() { System.out.println("laught"); } public void exception() throws InterruptedException{ Thread.sleep(1000); } }
Interface :Axe
package java_.lang_.component.bean; public interface Axe { public String chop(); }
Class : SteelAxe
package java_.lang_.component.bean.impl; import java_.lang_.component.bean.Axe; public class SteelAxe implements Axe { @Override public String chop() { return "用钢斧砍柴真快"; } }
Class :Class_T
package java_.lang_; import java.lang.reflect.Array; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.List; import java_.lang_.component.bean.Axe; import java_.lang_.component.bean.Person; import java_.lang_.component.bean.impl.Chinese; import java_.lang_.component.bean.impl.SteelAxe; import java_.lang_.component.bean.impl.Teacher; //T - 由此 Class 对象建模的类的类型。例如, String.class 的类型是 Class<String>。如果将被建模的类未知,则使用 Class<?>。 //Class 类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组属于被映射为 Class 对象的一个类,
//所有具有相同元素类型和维数的数组都共享该 Class 对象。
//基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也表示为 Class 对象。 //Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的。 public class Class_T { public static void main(String[] args) throws Exception{ Chinese chinese = new Chinese(); System.out.println(chinese.getClass().getName()); System.out.println(chinese.getClass()); System.out.println("----------------------Class类的常用方法--------------"); // 传入完整的“包.类”名称实例化Class对象 Class<?> clazzChinese = Class.forName("java_.lang_.component.bean.impl.Chinese"); // 得到一个类中的全部构造方法,按类中构造方法的顺序排列:无参、有参:0、1 System.out.println("得到一个类中的全部构造方法"); Constructor[] constructorsChinese = clazzChinese.getConstructors(); for(Constructor<?> constructor : constructorsChinese){ System.out.println(constructor); } // 得到本类中单独定义的全部属性 System.out.println("得到本类中单独定义的全部属性"); Field[] fieldDeclaredsChinese = clazzChinese.getDeclaredFields(); for(Field fieldDeclared : fieldDeclaredsChinese){ System.out.println(fieldDeclared); } // 取得本类继承而来的全部属性 System.out.println("取得本类继承而来的全部属性"); Field[] fields = clazzChinese.getFields(); for(Field field : fields){ System.out.println(field); } // 得到一个类中的全部方法 System.out.println("得到一个类中的全部方法"); Method[] methods = clazzChinese.getMethods(); for(Method method : methods){ System.out.println(method); } // 返回一个Method对象,并设置一个方法中的所有参数类型 System.out.println("返回一个Method对象,并设置一个方法中的所有参数类型"); Method method = clazzChinese.getMethod("setName", String.class); Chinese lime = (Chinese) clazzChinese.newInstance(); method.invoke(lime, "lime"); System.out.println(lime.getName()); // 得到一个类中所有实现的全部接口 System.out.println("得到一个类中所有实现的全部接口"); Class[] interfaces = clazzChinese.getInterfaces(); for(Class<?> interfaceClass : interfaces){ System.out.println(interfaceClass); } // 得到一个类完整的“包.类”名称 System.out.println("得到一个类完整的“包.类”名称"); System.out.println(clazzChinese.getName()); // 得到一个类的包 System.out.println("得到一个类的包"); System.out.println(clazzChinese.getPackage()); // 得到一个类的父类 System.out.println("得到一个类的父类"); System.out.println(clazzChinese.getSuperclass()); // 根据Class定义的类实例化对象 System.out.println("根据Class定义的类实例化对象"); Teacher teacher = (Teacher) clazzChinese.newInstance(); System.out.println(teacher); // 返回表示数组类型的Class System.out.println("返回表示数组类型的Class"); Class<? extends Person[]> clazzArray = new Person[]{}.getClass(); System.out.println(clazzArray); // 判断此Class 是否是一个数组 System.out.println("判断此Class 是否是一个数组"); if(clazzArray.isArray()){ System.out.println("isArray"); }else{ System.out.println("not isArray"); } System.out.println("budong"); // 通过无参构造实例化对象 System.out.println("通过无参构造实例化对象"); Chinese china = (Chinese) clazzChinese.newInstance(); System.out.println(china); // 调用有参构造实例化对象 System.out.println("调用有参构造实例化对象"); Constructor[] constructorsChina = clazzChinese.getConstructors(); Person person = (Person) constructorsChina[0].newInstance("lime",new SteelAxe()); person.userAxe(); System.out.println("-------------Constructor常用方法--------------------"); // 得到构造方法的修饰符 System.out.println("得到构造方法的修饰符"); int modifier = constructorsChina[0].getModifiers(); System.out.println(modifier); System.out.println(Modifier.toString(modifier)); // 得到构造方法的名称 System.out.println("得到构造方法的名称"); System.out.println(constructorsChina[0].getName()); // 得到构造方法中参数的类型 System.out.println("得到构造方法中参数的类型"); Class[] parameterTypes = constructorsChina[0].getParameterTypes(); for(Class<?> parameterType : parameterTypes){ System.out.println(parameterType); } // 返回此构造的信息 System.out.println("返回此构造的信息"); for(Constructor<?> constructor : constructorsChina){ System.out.println(constructor.toString()); } // 向构造方法中传递参数,实例化对象 System.out.println("向构造方法中传递参数,实例化对象"); Chinese per = (Chinese) constructorsChina[0].newInstance("lime",new SteelAxe()); System.out.println(per.toString()); System.out.println("----------------------反射的应用------取得类的结构-----------------"); System.out.println("-----------------------取得全部方法--------------------"); System.out.println("---------------------Method类中的常用方法---------------"); // 取得本方法的访问修饰符 System.out.println("取得本方法的访问修饰符"); Method meth = clazzChinese.getDeclaredMethod("setName",String.class); System.out.println(meth.getModifiers()); System.out.println(Modifier.toString(meth.getModifiers())); // 获取方法的名称 System.out.println("获取方法的名称"); Method[] meths = clazzChinese.getDeclaredMethods(); for(Method metho : meths){ System.out.println(metho.getName()); } // 得到方法的全部参数类型 System.out.println("得到方法的全部参数类型"); for(Method metho : meths){ System.out.println(metho.getName()); Class[] params = metho.getParameterTypes(); for(Class<?> param : params){ System.out.println(param); } } // 得到方法的返回值类型 System.out.println("得到方法的返回值类型"); for(Method metho : meths){ System.out.print(Modifier.toString(metho.getModifiers()) + " "); System.out.println(metho.getReturnType()); } // 得到一个方法的全部抛出异常 System.out.println("得到一个方法的全部抛出异常"); Method methodException = clazzChinese.getMethod("exception"); System.out.print(Modifier.toString(methodException.getModifiers()) + " "); System.out.print(methodException.getReturnType() + " "); System.out.print(methodException.getName() + "("); Class[] paramMethods = methodException.getParameterTypes(); if(paramMethods.length > 0){ for(int i = 0;i < paramMethods.length - 1;i++){ System.out.print(paramMethods[i].getName().substring(paramMethods[i].getName().lastIndexOf(".")) + ","); } System.out.print(paramMethods[paramMethods.length-1]); } System.out.print(") throws "); Class[] exceptionClasses = methodException.getExceptionTypes(); if(exceptionClasses.length > 0){ for(int i = 0;i < exceptionClasses.length - 1;i++){ System.out.print(exceptionClasses[i].getName().substring(exceptionClasses[i].getName().lastIndexOf(".")) + ", "); } System.out.println(exceptionClasses[exceptionClasses.length-1].getName()); } for(Class<?> exce : exceptionClasses){ System.out.println(exce); } System.out.println("---------------------------------------------"); System.out.println("--------------------获取全部属性-----------------"); System.out.println("----------------Field类的常用方法----------------"); // 得到一个对象中属性的具体内容 System.out.println("得到一个对象中属性的具体内容"); Chinese ch = (Chinese) clazzChinese.newInstance(); Field commonPro = clazzChinese.getDeclaredField("commonPro"); System.out.println(commonPro.getName() + " isAccessible " + commonPro.isAccessible()); commonPro.set(ch, "lime"); commonPro.get(ch); System.out.println(ch.getCommonPro()); Field name = clazzChinese.getDeclaredField("name"); System.out.println(name.getName() + " isAccessible " + name.isAccessible()); if(name.isAccessible()){ }else{ name.setAccessible(true); name.set(ch, "Oracle"); name.get(ch); System.out.println(ch.getName()); } // 设置指定对象中属性的具体内容 System.out.println("设置指定对象中属性的具体内容"); // 得到属性的修饰符 System.out.println("得到属性的修饰符"); System.out.println(commonPro.getModifiers()); System.out.println(Modifier.toString(commonPro.getModifiers())); // 返回此属性的名称 System.out.println("返回此属性的名称"); System.out.println(commonPro.getName()); // 判断此属性是否可被外部访问 System.out.println("判断此属性是否可被外部访问"); System.out.print(Modifier.toString(commonPro.getModifiers()) + " "); if(commonPro.isAccessible()){ System.out.println("isAccessible"); }else{ System.out.println("not isAccessible"); } System.out.print(Modifier.toString(clazzChinese.getDeclaredField("name").getModifiers()) + " "); if(clazzChinese.getDeclaredField("name").isAccessible()){ System.out.println("isAccessible"); }else{ System.out.println("not isAccessible"); } // 设置一个属性是否可被外部访问 System.out.println("设置一个属性是否可被外部访问"); commonPro.setAccessible(true); if(commonPro.isAccessible()){ System.out.println("isAccessible"); }else{ System.out.println("not isAccessible"); } // 设置一组属性是否可被外部访问 System.out.println("设置一组属性是否可被外部访问"); Field[] fieldsAll = clazzChinese.getDeclaredFields(); System.out.println("设置前"); for(Field field : fieldsAll){ System.out.println(field.getName() + " isAccessible:" + field.isAccessible()); } for(Field field : fieldsAll){ field.setAccessible(true); } System.out.println("全部设置为true"); for(Field field : fieldsAll){ System.out.println(field.getName() + " isAccessible:" + field.isAccessible()); } // 获取属性的类型 System.out.println("获取属性的类型"); for(Field field : fieldsAll){ System.out.println(field.getName() + " " + field.getType()); } // 获取继承父类的全部属性 System.out.println("获取继承父类的全部属性"); Field[] fieldsDeclared = clazzChinese.getFields(); for(Field field : fieldsDeclared){ System.out.println(field.getName()); } System.out.println("----------------------------------------------"); System.out.println("-------------------Java反射机制的深入应用-------------"); System.out.println("-------------通过反射调用类中的方法-------------------"); // 通过反射调用类中的方法 System.out.println("通过反射调用类中的方法"); { Method methodSetAxe = clazzChinese.getDeclaredMethod("setAxe", Axe.class); Chinese chin = (Chinese) clazzChinese.newInstance(); methodSetAxe.invoke(chin, new SteelAxe()); System.out.println(chin.getAxe()); } // 调用setter和getter方法 System.out.println("模拟setter和getter方法"); System.out.println("懒得写"); // 通过反射操作属性 System.out.println("通过反射操作属性"); // 得到一个对象中属性的具体内容 System.out.println("得到一个对象中属性的具体内容"); Chinese ch1 = (Chinese) clazzChinese.newInstance(); Field commonPro1 = clazzChinese.getDeclaredField("commonPro"); // commonPro1.setAccessible(true); commonPro1.set(ch1, "lime"); commonPro1.get(ch1); System.out.println(ch1.getCommonPro()); System.out.println("-----------通过反射操作数组--------------"); System.out.println("-----------Array类的常用方法------------"); // 根据下标取得数组内容 System.out.println("根据下标取得数组内容"); int[] temp = {1,2,3}; Class<?> c = temp.getClass().getComponentType(); System.out.println("类型:" + c.getName()); System.out.println("长度:" + Array.getLength(temp)); System.out.println("第一个内容:" + Array.get(temp,0)); // 修改指定位置的内容 System.out.println("修改指定位置的内容"); Array.set(temp, 0, 6); System.out.println("第一个内容:" + Array.get(temp,0)); // 根据已有的数组类型开辟新的数组对象 System.out.println("根据已有的数组类型开辟新的数组对象"); int[] newTemp = (int[]) Array.newInstance(temp.getClass().getComponentType(), Array.getLength(temp)*2); System.arraycopy(temp, 0, newTemp, 0, temp.length); for(int array : newTemp){ System.err.print(array); } System.out.println(); System.out.println(Array.getLength(newTemp)); for(int i = 0;i < Array.getLength(newTemp);i++){ System.out.print(Array.get(newTemp, i)); } System.out.println("--------------------------------"); } }
动态代理
通过一个代理类完成全部的代理功能,那么此时就必须使用动态代理完成。
在Java中想实现动态代理机制,则需要java.lang.reflect.InvocationHandler接口和java.lang.reflect.Proxy类的支持。
InvocationHandler接口的定义如下:
/* * proxy : (此处有误吧?被代理的对象)应该是指最终生成的代理对象,打印出来是class $proxy0 * method : 要调用的方法 * args[] : 方法调用时所需要的参数。 */ public Object invoke(Object proxy,Method method,Object[] args) throws Throwable;
Proxy类是专门完成代理的操作类,可以通过此类为一个或多个接口动态地生成实现类。
Proxy类提供了如下的操作方法:
// 通过newProxyInstance()方法可以动态地生成实现类 /* * loader : 类加载器。Proxy.class.getClassLoader().getClass().getName(); * interfaces : 得到全部的接口。 * hander : 得到Invocationhandler接口的子类实例。 */ public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler handler) throws lllegalArgumentException{ }
Class : MyInvocationHandler
package edu.pri.lime._7_8_3.demo.bean; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class MyInvocationHandler implements InvocationHandler{ // 真实主题 private Object obj; // 绑定真实操作主题 public Object bind(Object obj){ this.obj = obj; // Proxy类是专门完成代理的操作类,可以通过此类为一个或多个接口动态地生成实现类。 // 通过Proxy.newProxyInstance()可以动态地生成实现类 // 取得代理对象 return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this); } // 动态调用方法 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // 调用方法,传入真实主题和参数 args[0] = "Oracle"; Object temp = method.invoke(this.obj, args); // 返回方法的返回信息 return temp; } }
Interface : Subject
package edu.pri.lime._7_8_3.demo.bean; //定义Subject接口 public interface Subject { // 定义抽象方法say public String say(String name,int age); }
Class : RealSubject
package edu.pri.lime._7_8_3.demo.bean.impl; import edu.pri.lime._7_8_3.demo.bean.Subject; //定义真实主题实现类 //在操作时直接将真实主题类的对象传入到MyInvocationHandler类的bind()方法中即可 public class RealSubject implements Subject { public String say(String name, int age) { return "姓名:" + name + ", 年龄:" + age; } }
Class : DynaProxyDemo
package edu.pri.lime._7_8_3.demo.main; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import edu.pri.lime._7_8_3.demo.bean.MyInvocationHandler; import edu.pri.lime._7_8_3.demo.bean.Subject; import edu.pri.lime._7_8_3.demo.bean.impl.RealSubject; public class DynaProxyDemo { public static void main(String[] args) { { // 实例化代理操作类 MyInvocationHandler handler = new MyInvocationHandler(); // 绑定对象 Subject sub = (Subject) handler.bind(new RealSubject()); // 通过动态代理调用方法 String info = sub.say("lime", 20); System.out.println(info); } } }
Console :
姓名:Oracle, 年龄:20
啦啦啦
啦啦啦