反射
面向对象编程的思维是万事万物皆对象,那么类是不是对象,是谁的对象?
在反射当中,类是对象,是Java.lang.Class的对象。
类是对象,那么如何获取对象,获取对象有哪些方法
类对象的获取方法主要有以下三种方法
//任何一个类都有一个静态成员变量Class Class c1 = Foo.class; Class c2 =foo1.getClass(); Class c3 = Class.forName("com.wxf.reflect.Foo");
一个类主要有构造方法,成员变量,方法,以及个元素的修饰符
c.getMethods()和c.getDeclaredMethods()前者获取到的是所有public方法,包括从父类继承来的,后者只获取当前类的所声明的方法,同样构造方法,成员变量也是如此
/** * Method类 方法对象 * 一个成员方法就是一个Method对象 * getMethods()方法获取的是所有public的函数,包括父类集成的 * getDeclaredMethodes()自己声明的 */ Method[] ms = c.getMethods(); for(int i =0 ;i <ms.length;i++){ Class returnType = ms[i].getReturnType(); System.out.print(returnType.getSimpleName()+" "); System.out.print(ms[i].getName()+"("); //获取参数类型 Class[] paramTypes = ms[i].getParameterTypes(); for(Class class1:paramTypes){ System.out.print(class1.getSimpleName()+","); } System.out.println(")"); }
这是获取一个类的方法
Class c = obj.getClass(); /** *成员变量也是对象 *Field */ Field[] fs = c.getDeclaredFields(); for(Field f :fs){ Class fieldType = f.getType(); String typeName = fieldType.getName(); String fieldName = f.getName(); System.out.println(typeName +" " +fieldName); }
获取一个类的成员变量
Constructor[] cs = c.getDeclaredConstructors(); for(Constructor constructor:cs){ System.out.print(constructor.getName()+"("); Class[] paramTypes =constructor.getParameterTypes(); for(Class class1:paramTypes){ System.out.print(class1.getSimpleName()+","); } System.out.println(")"); }
获取一个类的构造方法
以上是获取类的信息
下面是用反射去使用类
public class MethodDemo1 { public static void main(String[] args) { A a1 = new A(); Class c = a1.getClass(); try { Method m = c.getMethod("print", new Class[]{int.class,int.class}); m.invoke(a1, new Object[]{10,20}); //方法的反射操作 //如果方法没有返回值返回null,如果有返回返回值 Method m1 = c.getMethod("print", new Class[]{String.class,String.class}); m1.invoke(a1,new Object[]{"hello","world"}); System.out.println("======================"); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } class A{ public void print(int a,int b){ System.out.println(a+b); } public void print(String a,String b){ System.out.println(a+"---"+b); }
下一个是对List的操作,去泛型
public static void main(String[] args) { ArrayList list = new ArrayList(); ArrayList<String>list1 = new ArrayList<String>(); list1.add("hello"); Class c1 = list.getClass(); Class c2 = list1.getClass(); System.out.println(c1==c2); //编译后去泛型 Method m; try { m = c2.getMethod("add", Object.class); m.invoke(list1, 100); System.out.println(list1.size()); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } }当然反射也可以改变类的成员变量的值