java中的反射三(反射机制深入---获得类的结构)

来源:互联网 发布:淘宝上的epiphone 编辑:程序博客网 时间:2024/05/20 18:48

取得类的结构

在开发中可以通过反射得到一个类的完整结构,那么这就是使用到java.lang.reflect包中的以下几个类:

Constructor:表示类中的构造方法

Field:表示类中的属性

Method:表示类中的方法

 

以上三个类都是AccessibleObject类的子类

 

案例如下:

 

 

interface China{// 定义China接口public static final String NATIONAL = "China" ;// 定义全局常量public static final String AUTHOR = "fly" ;// 定义全局常量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 ;}};

 

取得Person类的全部实现的接口

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()) ;// 输出接口名称}}};


取得Pserson类所继承的父类

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

取得Person类的全部构造方法(包含方法中参数,方法的修饰符,以及名称)

public class GetConstructorDemo03{public static void main(String args[]){Class<?> c1 = null ;// 声明Class对象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("){}") ;}}};

取得Pserson类中的方法

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() ;}}};

取得Pserson类中的属相

1.取得实现的接口或者父类中的公共属性:

public Field[] getField()throws SecurityException

2.得到本类中全部属性:

public Field[]  getDeclaredFields()throws SecurityException

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(" ;") ;   }  } }};

 

 



原创粉丝点击