黑马程序员----------反射

来源:互联网 发布:网络教育的英文怎么说 编辑:程序博客网 时间:2024/05/12 18:31

------- android培训java培训、期待与您交流! ----------

获取某个类的Class对象的三种方式:
  
  方式一:调用对象的getClass()方法。它是Object类中的方法。
       此方法是普通方法,不是静态的,要通过类的对象的引用去调用。
       Student stu = new Studetn();
       Class stuClass = stu.getClass();
  方式二:任何的"数据类型"都有一个"静态的属性"--class属性,这个属性可以
       获取这个类的Class对象
  方式三:调用Class类中的静态方法forName()可以获取某个类的Class对象;(常用方式)
   public static Class forName(String className)


通过这个Class对象,我们可以:
  
  1.获取并调用这个类的所有的构造方法:
   批量获取
   1.public Constructor[] getConstructors():获取所有公共构造方法
   2.public Constructor[] getDeclaredConstructors():获取所有构造方法。包括公有,受保护,默认,私有
   获取单个的构造方法:
   1.public Constructor getConstructor(Class... parameterTypes):获取类中的指定的"公有构造方法"。
     参数:parameterTypes:构造方法形参的类型的Class
   2.public Constructor getDeclaredConstructor(Class...parameterTypes):获取类中的任何的构造方法,包括私有的

调用构造方法:通过Constructor去调用。使用方法:public T newInstance(Object... initargs)


通过Class对象获取成员属性,并调用:

 批量获取:
1.Field[] getFields() :所用"公有"的成员属性
2.Field[] getDeclaredFields()  :所有的成员属性,包括私有的:
 获取单个的属性
1.Field getField(String fieldName):获取单个的,公有的成员属性
2.Field getDeclaredField(String fieldName):获取单个的成员属性,可以是任何的访问级别


通过Class对象获取某个类的成员方法并调用:
  
  批量获取:
   1.Method[] getMethods() :获取所有的"公有"方法;
   2.Method[] getDeclaredMethods() :获取所有方法,包括私有的。
  获取单个的:
   1.Method getMethod(String name, Class<?>... parameterTypes) :获取某个公有的方法。
                形参:name:方法名;
                 parameterTypes:形参的类型列表;
                2.Method getDeclaredMethod(String name, Class<?>... parameterTypes):获取某个方法。可以是私有的。


以下为案例代码:

首先创建一个被调用的类生成class文件:

public class Student {//********一些构造方法***********////公有的public Student(){System.out.println("调用了公有的,无参的构造方法");}public Student(boolean b){System.out.println("调用了公有的,带参的构造方法。b = " + b);}//受保护的protected Student(int n){System.out.println("调用了受保护的构造方法 n = " + n);} //默认的Student(String s){System.out.println("调用了默认的构造方法。s = " + s);}//私有的private Student(char c){System.out.println("调用了私有的构造方法。c = " + c);}//*****************成员属性***************//public String stuName;protected int age;char sex;private String address;//*****************成员方法*******************//public void show(){System.out.println("调用了公有,无参的show()方法");}protected void show(String s){System.out.println("调用了受保护的,带参的show()方法。参数s = " + s);}void show(int n){System.out.println("调用了默认的,带参的show()方法。参数n = " + n);}private int  show(char c){System.out.println("调用了私有的,带参的带返回值的show()方法。参数c = " + c);return 10 + 20;}}
然后再main方法中实现:

public static void main(String[] args) throws Exception {//三种创建class类的方法Student stu=new Student();Class c1=stu.getClass();Class c2=Student.class;Class c3=null;try {c3=Class.forName("cn.wxw.反射.Student");} catch (ClassNotFoundException e) {}//获取class文件中的所有构造方法Constructor[] g1=c3.getDeclaredConstructors();for(Constructor c:g1){System.out.println(c);}System.out.println("------------------------");//获取所有的 公有 狗仔方法 Constructor[] g2=c3.getConstructors(); for(Constructor c:g2){ System.out.println(c); }System.out.println("------------------------");//获取单个公共构造方法Constructor g3=c3.getConstructor();System.out.println(g3);g3=c3.getConstructor(boolean.class );System.out.println(g3);System.out.println("------------------------");//获取一个任类型构造方法Constructor g4=c3.getDeclaredConstructor(char.class);System.out.println(g4);System.out.println("------------------------");//以下是获取字段//获取所有字段Field[] f1=c3.getDeclaredFields();for(Field f:f1){System.out.println(f);}System.out.println("------------------------");//获取公有字段Field[] f2=c3.getFields();for(Field f:f2){System.out.println(f);}System.out.println("------------------------");//获取指定公有字段Field f3=c3.getField("stuName");System.out.println(f3);System.out.println("------------------------");//获取指定字段Field f4=c3.getDeclaredField("address");System.out.println(f4);//下面是获取成员方法  也分为4种System.out.println("*************************************获取所有\"公有\"的成员方法**********************************");Method[] methodArray = c3.getMethods();//包含了父类的方法for(Method m : methodArray){System.out.println(m);}System.out.println("*************************************获取所有的成员方法,包括私有的**********************************");Method[] methodArray2 = c3.getDeclaredMethods();//不包含父类的。for(Method m : methodArray2){System.out.println(m);}System.out.println("*************************************获取单个\"公有\"的\"无参\"的成员方法**********************************");Method m1 = c3.getMethod("show");System.out.println(m1);System.out.println("*************************************获取单个\"私有\"的\"带参\"的成员方法**********************************");Method m2 = c3.getDeclaredMethod("show", char.class);System.out.println(m2);}



0 0
原创粉丝点击