【Java反射机制】_反射应用——取得类的结构笔记
来源:互联网 发布:db2数据库和oracle 编辑:程序博客网 时间:2024/05/22 03:01
【Java反射机制】_反射应用——取得类的结构笔记
本章目标:
可以使用反射取得实现的全部接口
可以使用反射取得一个类所继承的父类
可以使用反射取得一个类的全部构造方法
可以使用反射取得一个类的全部方法
可以使用反射取得一个类的全部属性
具体内容
反射机制的深入————取得类的结构
在实际开发中,以上的程序就是反射应该最多的地方,当然,反射机制所提供的功能远远不止如此,还可以通过反射得到一个类的完整结构,那么这样就使用到java.lang.reflect包中的以下几个类:
Constructor:表示类中的构造方法
Field:表示类中的属性
Method:表示类中的方法
这三个类都是AccessibleObject类的子类
操作类:
要想取得一个类所实现的全部接口,则必须使用Class类中的getInterfaces()方法。此方法定义如下:
public Class[] getInterfaces()
此方法返回一个Class类的对象数组,之后就可以直接利用Class类中的getName()方法输出即可。
如果要想取得一个类所实现的全部接口,可以使用Class类中的
public Class<?>[] getInterfaces()
因为一个类可以同时实现多个接口,所以在此处将以一个数组的形式返回实现的全部接口。
格式:
public Class<? super T> getSuperclass()
此方法返回的是Class实例地,和之前得到接口一样,可以通过getName()方法取得名称。
取得父类
Constructor类中存在了以下的几个方法:
取得修饰符:public int getModifiers()
取得方法名称:public String getName()
取得参数的类型:public Class<?>[] getParameterTypes()
此时,在操作之后,发现,所有的修饰符变成了数字.
下面还原修饰符
public static String toString(int mod)
int mo = con[i].getModifiers(); //取出权限
System.out.print(Modifier.toString(mo)+" "); //还原权限
下面修改如下:
public Method[] getDeclaredMethods() throws SecurityException //输出本类的全部方法
public Method[] getMethods() throws SecurityException //输出本类的全部方法
方法操作:
取得全部的返回值:public Class<?> getReturnType()
取得全部的参数:public Class<?>[] getParameterTypes()
取得修饰符:public int getModifiers()
取得异常信息:public Class<?>[] getExceptionTypes()
得到实现的接口或父类中的公共属性:public Field[] getFields() throws SecurityException
得到本类中的全部属性:public Field[] getDeclaredFields() throws SecurityException
本章目标:
可以使用反射取得实现的全部接口
可以使用反射取得一个类所继承的父类
可以使用反射取得一个类的全部构造方法
可以使用反射取得一个类的全部方法
可以使用反射取得一个类的全部属性
具体内容
反射机制的深入————取得类的结构
在实际开发中,以上的程序就是反射应该最多的地方,当然,反射机制所提供的功能远远不止如此,还可以通过反射得到一个类的完整结构,那么这样就使用到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(" ;") ; } } }};
- 【Java反射机制】_反射应用——取得类的结构笔记
- 【Java反射机制】_反射应用——取得类的结构笔记
- Java反射应用-取得类的结构
- Java反射机制(二):通过反射取得类的结构
- java反射----取得类结构
- 16---java反射机制03(取得类结构)
- 反射--取得类的结构
- JAVA反射机制 检查类的结构
- Java反射机制(取得类的全部的属性)
- Java反射机制(取得类的全部的属性)
- JAVA反射机制的应用
- java反射机制的应用
- java反射机制的应用
- java 反射机制的应用
- java反射机制的应用
- 【Java反射机制】_认识Class类笔记
- 【Java反射机制】_认识Class类笔记
- Java学习笔记——反射机制
- Idea常用快捷键
- Oracle10g的ORA-3136错误(INBOUND_CONNECT_TIMEOUT参数)
- 对于一个频繁使用的短小函数,在C语言中应用什么实现,在C++中应用什么实现?
- srand((unsigned)time(NULL))和rand()
- HDU 3177 Crixalis's Equipment
- 【Java反射机制】_反射应用——取得类的结构笔记
- jobdu 6 日期差值
- 文档在线预览(一)-序
- 常见的内存错误以及如何避免
- Oracle 缓存表数据到高速缓存区
- 【转载】PHP版本讲解
- [学习记录] Android.mk分析
- JPA JPQL 查询、排序
- 6,7,8 ICMP协议,ping和Traceroute