您的位置:首页 > 编程语言 > Java开发

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

2014-10-01 23:41 363 查看


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

分类: Java

目录(?)[-]

取得类所实现的全部接口
取得类所继承的父类
取得类中的全部构造方法
取得类中的方法
取得类中的属性

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

本章目标:

可以使用反射取得实现的全部接口

可以使用反射取得一个类所继承的父类

可以使用反射取得一个类的全部构造方法

可以使用反射取得一个类的全部方法

可以使用反射取得一个类的全部属性

具体内容

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

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

Constructor:表示类中的构造方法

Field:表示类中的属性

Method:表示类中的方法

这三个类都是AccessibleObject类的子类

操作类:

[java] view
plaincopyprint?

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

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

[java] view
plaincopyprint?

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()方法取得名称。

取得父类

[java] view
plaincopyprint?

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、取得类中的全部构造方法

[java] view
plaincopyprint?

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

[java] view
plaincopyprint?

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)+" "); //还原权限

下面修改如下:

[java] view
plaincopyprint?

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

[java] view
plaincopyprint?

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

[java] view
plaincopyprint?

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

}

}

}

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: