class类
1)在面向对象的世界里,万事万物皆对象。
Java语言中,静态成员、普通数据类型不是对象。
类是对象,类是Java.lang.Class类的实例对象。
public static void main(String[] args) { //Foo的实例对象如何表示 Foo foo1 = new Foo(); //任何一个类都是一个Class的实例对象,这个实例对象有三种表示方法 //第一种-->实际告诉我们任何一个类都有一个隐含的静态成员 Class c1 = Foo.class; //第二种-->,已知该类的对象通过getClass方法 Class c2 = foo1.getClass(); /*官网c1、c2表示Foo类的类类型 *万事万物皆对象 *类也是对象,是Class类的对象 *这个对象我们称为该类的类类型 */ //第三种 Class c3 = null; try { c3 = Class.forName("com.lei.Foo"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } //我们完全可以通过类的类类型创建该类的对象实例 try { Foo foo = (Foo)c1.newInstance(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
动态加载
编译时刻加载了是静态加载类,运行时刻加载类是动态加载类。new创建对象是静态加载类,在编译时就需要加载所有的可能使用的。
通过Class.forName("")动态加载类,运行时加载,通过类类型,创建该类的类对象。上面已经提到。
java获取方法信息
public static void printClassMessage(Object object) { //首先要获取类的类类型 Class c = object.getClass(); //获取类的名称 System.out.println("类的名称:"+c.getName()); /** * getMethods()方法获取的时所有public的函数,包括继承而来的 * getDeclaredMethods()获取的时所有自己声明的方法,不问访问权限 */ Method[] methods = c.getMethods(); for(int i = 0; i<methods.length; i++) { //得到方法的返回值类型的类类型 Class returnType = methods[i].getReturnType(); System.out.println(returnType.getName()+""); //得到方法的名称 System.out.println(methods[i].getName()+"("); //获取参数类型-->得到参数列表的类型的类类型 Class[] paramTypes = methods[i].getParameterTypes(); for(Class class1:paramTypes) { System.out.println(class1.getName()+","); } } }
java中获取成员变量的信息
成员变量也是对象
java.lang.reflet.Field类封装了关于成员变量的操作
getFields()方法获取的是所有public的成员变量信息
getDeclaredFied获取的是该类自己声明的成员变量信息
方法反射
1) 如何获取某个方法
方法的名称和方法的参数列表才能唯一决定某个方法
2)方法的反射操作
method.invoke(对象,参数列表)
public class Test { public static void main(String[] args) { A a = new A(); Class c = a.getClass(); try { //Method m = c.getMethod("print", new Class[] {int.class,int.class}); Method m = c.getMethod("print", int.class,int.class); //方法的反射操作 //方法的反射操作是用m对象来进行犯法调用,和a.pring()调用的效果相同 m.invoke(a,new Object[] {10,20}); } catch (Exception 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"); } }