【Java反射机制】_反射应用——取得类的结构笔记

来源:互联网 发布:db2数据库和oracle 编辑:程序博客网 时间:2024/05/22 03:01
【Java反射机制】_反射应用——取得类的结构笔记

本章目标:
可以使用反射取得实现的全部接口
可以使用反射取得一个类所继承的父类
可以使用反射取得一个类的全部构造方法
可以使用反射取得一个类的全部方法
可以使用反射取得一个类的全部属性


具体内容

反射机制的深入————取得类的结构


在实际开发中,以上的程序就是反射应该最多的地方,当然,反射机制所提供的功能远远不止如此,还可以通过反射得到一个类的完整结构,那么这样就使用到java.lang.reflect包中的以下几个类:

Constructor:表示类中的构造方法
Field:表示类中的属性
Method:表示类中的方法

这三个类都是AccessibleObject类的子类

操作类:

package org.lxh.demo15;interface China{    //定义China接口    public static final String NATIONAL = "China";    //定义全局常量    public static final String AUTHOR = "牛儿吃草";    //定义全局常量    public void sayChina();                //无参的,没有返回值的方法    public String sayHello(String name,int age);    //定义有两个参数的方法,并返回内容}public class Person implements China{    private String name;    private int age;    public Person(){//无参构造            }    public Person(String name){        this.name = name;    //设置name属性        }    public Person(String name,int age){        this(name);        this.age = age;        }    public void sayChina(){        System.out.println("作者:"+AUTHOR+",国籍:"+NATIONAL);    }    public String SayHello(String name,int age){        return name+",你好!我今年:"+age+"岁了!";    }    public void SetName(String name){        this.name = name;    }    public void setAge(int age){        this.age = age;    }    public String getName(){        return this.name;    }    public int getAge(){        return this.age;    }}



3.1、取得类所实现的全部接口


要想取得一个类所实现的全部接口,则必须使用Class类中的getInterfaces()方法。此方法定义如下:
public Class[] getInterfaces()
此方法返回一个Class类的对象数组,之后就可以直接利用Class类中的getName()方法输出即可。

如果要想取得一个类所实现的全部接口,可以使用Class类中的
public Class<?>[] getInterfaces()

因为一个类可以同时实现多个接口,所以在此处将以一个数组的形式返回实现的全部接口。

package org.lxh.demo15.classinfodemo;public class GetInterfaceDemo{    public static void main(String args[]){        Class<?> c1 = null;    //声明Class对象        try{            c1 = Class.forName("org.lxh.demo15.Person");    //实例化对象        }catch(ClassNotFoundException e){            e.printStackTrace();        }        Class<?> c[] = c1.getInterfaces();        for(int i=0;i<c.length;i++){            System.out.println("实现的接口名称:"+c[i].getName());//输出接口名称        }    }}


3.2、取得类所继承的父类


格式:
public Class<? super T> getSuperclass()
此方法返回的是Class实例地,和之前得到接口一样,可以通过getName()方法取得名称。

取得父类

package org.lxh.demo15.classinfodemo;public class GetSuperClassDemo{    public static void main(String args[]){        Class<?> c1 = null;        try{            c1 = Class.forName("org.lxh.demo15.Person");        }catch(ClassNotFoundException e){            e.printStackTrace();        }        Class<?> c2 = c1.getSuperclass();    //取得父类        System.out.println("父类名称:"+c2.getName());    }}



3.3、取得类中的全部构造方法


package org.lxh.demo15.classinfodemo;import java.lang.reflect.Constructor;public class GetConstructorDemo01{    public static void main(String args[]){        Class<?> c1 = null;        try{            c1 = Class.forName("org.lxh.demo15.Person");        }catch(ClassNotFoundException e){            e.printStackTrace();        }        Constructor<?> con[] = c1.getConstructors();        for(int i=0;i<con.length;i++){            System.out.println("构造方法:"+con[i]);    //输出构造,直接打印        }    }}


Constructor类中存在了以下的几个方法:

取得修饰符:public int getModifiers()
取得方法名称:public String getName()
取得参数的类型:public Class<?>[] getParameterTypes()

package org.lxh.demo15.classinfodemo;import java.lang.reflect.Constructor;public class GetConstructorDemo02{    public static void main(String args[]){        Class<?> c1 = null;        try{            c1 = Class.forName("org.lxh.demo15.Person");        }catch(ClassNotFoundException e){            e.printStackTrace();        }        Constructor<?> con[] = c1.getConstructors();        for(int i=0;i<con.length;i++){            Class<?> p[] = con[i].getParameterTypes();    //得到构造方法中的全部参数            System.out.print("构造方法:");    //输出构造,直接打印            System.out.print(con[i].getModifiers()+" ");    //得到修饰符            System.out.print(con[i].getName());    //取得构造方法的名字            System.out.print("(");            for(int j=0;j<p.length;j++){                System.out.print(p[j].getName()+"arg"+i);                if(j<p.length-1){                    System.out.print(",");    //输出","                }            }            System.out.println("){}");        }    }}


此时,在操作之后,发现,所有的修饰符变成了数字.

下面还原修饰符

public static String toString(int mod)
int mo = con[i].getModifiers();            //取出权限
System.out.print(Modifier.toString(mo)+" ");    //还原权限

下面修改如下:

package org.lxh.demo15.classinfodemo;import java.lang.reflect.Constructor;import java.lang.reflect.Modifier;public class GetConstructorDemo03{    public static void main(String args[]){        Class<?> c1 = null;        try{            c1 = Class.forName("org.lxh.demo15.Person");        }catch(ClassNotFoundException e){            e.printStackTrace();        }        Constructor<?> con[] = c1.getConstructors();        for(int i=0;i<con.length;i++){            Class<?> p[] = con[i].getParameterTypes();    //得到构造方法中的全部参数            System.out.print("构造方法:");    //输出构造,直接打印            int mo = con[i].getModifiers();            //取出权限            System.out.print(Modifier.toString(mo)+" ");    //还原权限            System.out.print(con[i].getName());    //取得构造方法的名字            System.out.print("(");            for(int j=0;j<p.length;j++){                System.out.print(p[j].getName()+"arg"+i);                if(j<p.length-1){                    System.out.print(",");    //输出","                }            }            System.out.println("){}");        }    }}



3.4、取得类中的方法


public Method[] getDeclaredMethods() throws SecurityException    //输出本类的全部方法
public Method[] getMethods() throws SecurityException    //输出本类的全部方法

方法操作:
取得全部的返回值:public Class<?> getReturnType()
取得全部的参数:public Class<?>[] getParameterTypes()
取得修饰符:public int getModifiers()
取得异常信息:public Class<?>[] getExceptionTypes()

package org.lxh.demo15.classinfodemo ;import java.lang.reflect.Method ;    // 导入构造方法的包import java.lang.reflect.Modifier ;    // 导入构造方法的包public class GetMethodDemo{    public static void main(String args[]){        Class<?> c1 = null ;        // 声明Class对象        try{            c1 = Class.forName("org.lxh.demo15.Person") ;    // 实例化对象        }catch(ClassNotFoundException e){            e.printStackTrace() ;        }        Method m[] = c1.getMethods() ;    // 取得全部方法        for(int i=0;i<m.length;i++){            Class<?> r = m[i].getReturnType() ;    // 得到返回值类型            Class<?> p[] = m[i].getParameterTypes() ;    // 取得全部参数的类型            int xx = m[i].getModifiers() ;    // 得到修饰符            System.out.print(Modifier.toString(xx) + " ") ;    // 输出修饰符            System.out.print(r + " ") ;            System.out.print(m[i].getName()) ;            System.out.print("(") ;            for(int j=0;j<p.length;j++){                System.out.print(p[j].getName() + " " + "arg" + j) ;                if(j<p.length-1){                    System.out.print(",") ;                }            }            Class<?> ex[] = m[i].getExceptionTypes() ;    // 取出异常            if(ex.length>0){                System.out.print(") throws ") ;            }else{                System.out.print(")") ;            }            for(int j=0;j<ex.length;j++){                System.out.print(ex[j].getName()) ;                if(j<p.length-1){                    System.out.print(",") ;                }            }            System.out.println() ;        }    }};


3.5、取得类中的属性


得到实现的接口或父类中的公共属性:public Field[] getFields() throws SecurityException
得到本类中的全部属性:public Field[] getDeclaredFields() throws SecurityException

package org.lxh.demo15.classinfodemo ;import java.lang.reflect.Field ;    // 导入构造方法的包import java.lang.reflect.Modifier ;    // 导入构造方法的包public class GetFieldDemo{    public static void main(String args[]){        Class<?> c1 = null ;        // 声明Class对象        try{            c1 = Class.forName("org.lxh.demo15.Person") ;    // 实例化对象        }catch(ClassNotFoundException e){            e.printStackTrace() ;        }        {    // 本类属性            Field f[] = c1.getDeclaredFields() ;    // 取得本类中的属性            for(int i=0;i<f.length;i++){                Class<?> r = f[i].getType() ;    // 得到属性类型                int mo = f[i].getModifiers() ;    // 得到修饰符的数字                String priv = Modifier.toString(mo) ; // 还原修饰符                System.out.print("本类属性:") ;                System.out.print(priv + " ") ;                    System.out.print(r.getName() + " ") ;    // 得到属性类型                System.out.print(f[i].getName()) ;    // 输出属性名称                System.out.println(" ;") ;            }        }        {    // 公共属性            Field f[] = c1.getFields() ;    // 取得本类中的公共属性            for(int i=0;i<f.length;i++){                Class<?> r = f[i].getType() ;    // 得到属性类型                int mo = f[i].getModifiers() ;    // 得到修饰符的数字                String priv = Modifier.toString(mo) ; // 还原修饰符                System.out.print("公共属性:") ;                System.out.print(priv + " ") ;                    System.out.print(r.getName() + " ") ;    // 得到属性类型                System.out.print(f[i].getName()) ;    // 输出属性名称                System.out.println(" ;") ;            }        }    }};

原创粉丝点击