Java反射详解

来源:互联网 发布:tensorflow tutorial 编辑:程序博客网 时间:2024/06/06 11:38

Class类的使用

  1. Foo这个类也是实例对象,是Class类的实例对象,如何表示见下方
  2. 任何一个类都是Class的实例对象,这个实例对象有三种表现方式
public static void main(String[] args){    //第一种表示方式,任何一个类都有一个隐含的静态成员变量class    Class c1 = Foo.class;    //第二种表达方式,已经知道该类的对象通过getClass方法    Foo foo1 = new Foo();    Class c2 = foo1.getClass();    //第三种表达方式    Class c3 = null;    try{        c3 = Class.forName("com.test.model.Foo");    }catch(ClassNotFoundException e){        e.printStackTrace();    }}

通过Class的实例创建Foo实例

newInstance()创建对象记得强制转换成该对象,强制转换的类要有无参构造方法

try{    Foo foo= (Foo)c1.newInstance();}catch(Exception e){    e.printStackTrace();}

动态加载类

Class.forName(“类的全称”)

  • 不仅表示类的类类型,还代表了动态加载类
  • 编译时候加载类是静态加载类,运行时刻加载类是动态加载类

获取方法信息

获取返回值类型、方法名、参数类型

public static void getClassMethod(Object obj){    Class c = obj.getClass();    //获取类的名称    System.out.println("类名为:"+c.getName());    /*     *Method类,方法对象     *一个成员方法,就是一个method对象     *getMethods()获取的是所有public的函数,包括父类继承而来     *getDeclaredMethods()获取的是所有该类自己的方法,不论访问权限*/     Method[] ms = c.getMethods();     for(int i=0;i<ms.length;i++){        //得到方法的返回值        Class returnType = ms[i].getReturnType();  //得到返回值.class        System.out.print(returnType.getName()+" ");  //得到返回值类型的名称        //得到方法的名称        System.out.print(ms[i].getName()+"(");        //获取参数类型,得到的是参数的类类型        Class[] paramTypes = ms[i].getParameterTypes();        for(Class class1 : paramTypes){            System.out.print(class1.getName()+",");        }        System.out.println(")");     }}

成员变量

//获取成员变量的信息public static void getField(Object obj){    Class c = obj.getClass();    /*    *成员变量也是对象,java.lang.reflect.Field    *Field类封装了关于成员变量的操作    *getFields()获取的是所有public的成员变量    *getDeclaredFields()获取的是所有该类自己声明的成员变量    */    Field[] fs = c.getDeclaredFields();    for(Field field : fs){        //得到成员变量的类型的类类型        Class fieldType = field.getType();        String typeName = fieldType.getName();        //得到成员变量的名称        String fieldName = field.getName();        System.out.println(typeName+"  "+fieldName);    }}

构造方法

public static void getConMessage(Object obj){    Class c = obj.getClass();    /*    *构造函数也是对象,java.lang.Constructor封装了构造函数的信息    *getConstructors()获取所有public的构造函数    *getDeclaredConstructors()获取所有的构造函数    */    Constructors[] cs = c.getDeclaredConstructors();    for(Constructor con : cs){        System.out.print(con.getName()+"(");        //获取构造函数的参数列表        Class[] paramTypes = con.getParameterTypes();        for(Class class1 : paramTypes){            System.out.print(class1.getName()+",");        }        System.out.println(")");    }}

方法反射的基本操作

public class MethodDemo1 {    public static void main(String[] args) {       //要获取print(int ,int )方法  1.要获取一个方法就是获取类的信息,获取类的信息首先要获取类的类类型        A a1 = new A();        Class c = a1.getClass();        /*         * 2.获取方法 名称和参数列表来决定           * getMethod获取的是public的方法         * getDelcaredMethod自己声明的方法         */        try {            //Method m =  c.getMethod("print", new Class[]{int.class,int.class});            Method m = c.getMethod("print", int.class,int.class);            //方法的反射操作              //a1.print(10, 20);方法的反射操作是用m对象来进行方法调用 和a1.print调用的效果完全相同            //方法如果没有返回值返回null,有返回值返回具体的返回值            //Object o = m.invoke(a1,new Object[]{10,20});            Object o = m.invoke(a1, 10,20);            System.out.println("==================");            //获取方法print(String,String)             Method m1 = c.getMethod("print",String.class,String.class);             //用方法进行反射操作             //a1.print("hello", "WORLD");             o = m1.invoke(a1, "hello","WORLD");             System.out.println("===================");            //获取方法print()             //Method m2 = c.getMethod("print", new Class[]{});                Method m2 = c.getMethod("print");               // m2.invoke(a1, new Object[]{});                m2.invoke(a1);        } catch (Exception e) {            // TODO Auto-generated catch block            e.printStackTrace();        }     }}class A{    public void print(){        System.out.println("helloworld");    }    public void print(int a,int b){        System.out.println(a+b);    }    public void print(String a,String b){        System.out.println(a.toUpperCase()+","+b.toLowerCase());    }}
1 0
原创粉丝点击