【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] viewplaincopyprint?
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(" ;") ;
}
}
}
};
相关文章推荐
- 【Java反射机制】_反射应用——取得类的结构笔记
- Java反射机制(二):通过反射取得类的结构
- 反射应用--取得类的结构
- Java反射应用-取得类的结构
- Java反射机制(二):通过反射取得类的结构
- .Net开发笔记(二十一) 反射在.net中的应用
- 反射学习笔记之遍历System.Drawing.Color结构(转载)
- C语言学习笔记(22结构体综合应用学生信息管理)
- 黑马程序员_学习笔记7可变参数的应用及1.5增强for的联合使用以及反射的总结
- 反射的应用--根据控件名取得控件
- ADO.NET的结构——ADO.NET学习&应用笔记之一
- 数据结构与算法学习笔记——堆栈及其应用(10以内简单四则计算器)
- 反射的应用--根据控件名取得控件
- Java学习笔记之反射的应用-动态代理
- .Net开发笔记(二十一) 反射在.net中的应用
- Java基础笔记-反射及应用
- C# 参考:反射 -- 学习笔记整理,概念与应用
- (转载)ADO.NET的结构——ADO.NET学习&应用笔记之一
- 反射的应用--根据控件名取得控件
- C# 参考:反射 -- 学习笔记整理,概念与应用