JAVA反射机制的学习

来源:互联网 发布:看图软件安卓版 编辑:程序博客网 时间:2024/05/27 16:43

1、反射的基本概念

    反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

2、反射的基本功能

  1.     可以通过反射取得一个类的实例化对象。
  2.     可以通过反射取得类的结构
  3.     可以通过反射进行属性方法的调用

3、认识反射

    正常情况下,一个类要想使用,则必须找到此类,之后通过此类产生实例化对象,必须先有类再有对象,那么如果现在要想通过一个对象找到其所在的类呢?在反射机制中Class类是一个操作的源头,所有的反射操作从此类展开,但是如果想要实例化此类对象可以通过以下三个途径完成:
  1. 通过Object类中的getClass方法: public  final Class<?> getClass();
  2. 通过类.class的形式:Person.class
  3. 通过类的静态方法:public  static calss<?>  forName(StringclassName) throws ClassNotFoundException

    最常用的是forName方法,其次是类class方法。在Class的使用中实例化对象是最常用的一种操作,而且日后所有的框架的各个程序的实现原理都是依靠Class类完成的。为了开发方便,一定在类中定义无参构造方法。

public class PersonClassDemo {//.class方法public static void main(String[] args) {Person p1=new Person();Class<Person> c=(Class<Person>) p1.getClass();System.out.println(c.getName());//返回对象为包名.person}}
public class PersonClassDemo3 {//验证forName方法public static void main(String[] args) {Class<?> c=null;try {c = Class.forName("prc.demo1.Person");} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println(c.getName());}}

4、通过反射实例化属性和方法

import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.Method;import java.lang.reflect.Modifier;public class getMethodsDemo1 {public static void main(String[] args)throws Exception {Class<?> c=Class.forName("prc.demo2.Person");System.out.println("------------取得类中所有普通方法名-----------");Method m[]=c.getMethods();for (int i = 0; i < m.length; i++) {System.out.println(m[i]);}System.out.println("------------取得类中所有接口-----------");Class<?> inter[]=c.getInterfaces();for (int i = 0; i < inter.length; i++) {System.out.println(inter[i].getName());}System.out.println("------------取得类中所有父类-----------");Class<?> sc=c.getSuperclass();System.out.println(sc.getName());System.out.println("------------取得类中所有构造器-----------");Constructor<?> con[]=c.getConstructors();for (int i = 0; i < con.length; i++) {int mod=con[i].getModifiers();String str=Modifier.toString(mod);Class<?>[] parm=con[i].getParameterTypes();System.out.print(str+" ");System.out.print(con[i].getName()+"(");for (int j = 0; j < parm.length; j++) {System.out.print(parm[j].getName()+","+"arg-"+j);}System.out.println(")");}System.out.println("------------取得返回值类型、异常、方法名-----------");for(int i=0;i<m.length;i++){String mod=Modifier.toString(m[i].getModifiers());//取得访问权限String metName=m[i].getName();//取得方法名Class<?> ret=m[i].getReturnType();//取得返回值类型Class<?> exc[]=m[i].getExceptionTypes();//取得全部异常Class<?> parm[]=m[i].getParameterTypes();System.out.print(mod+" ");System.out.print(ret+" ");System.out.print(metName+" ");for (int j = 0; j < parm.length; j++) {System.out.print(parm[j]+"arg-"+j);if(j<parm.length-1){System.out.print(",");}}}System.out.println("------------取得全部变量-----------");Field []f=c.getFields();//取得全部变量for (int i = 0; i < f.length; i++) {String mo=Modifier.toString(f[i].getModifiers());System.out.println(mo);System.out.println(f[i].getType().getName());}}}


0 0
原创粉丝点击