java中的反射

1、何为java反射机制:

在运行过程中,对于任意一个类都能够知道这个类的属性和方法;对于任意一个对象都能调用其属性和方法;这种动态获取信息和动态调用方法 就称为java反射

2、获取Class对象的3种方法

(1).通过Object类的getClass()方法。例如:

Class c1 = new String("").getClass();

(2).通过Class类的静态方法——forName()来实现:

Class c2 = Class.forName("MyObject");

(3).如果T是一个已定义的类型的话,在java中,它的.class文件名:T.class就代表了与其匹配的Class对象,例如:

Class c3 = Manager.class;

Class c4 = int.class;

Class c5 = Double[].class;//基于java当中一切皆对象的特征

3、Class类中的 几种重要的方法

1.getName()

一个Class对象描述了一个特定类的特定属性,而这个方法就是返回String形式的该类的简要描述。由于历史原因,对数组的Class对象

调用该方法会产生奇怪的结果

2.newInstance()

该方法可以根据某个Class对象产生其对应类的实例。需要强调的是,它调用的是此类的默认构造方法。例如:

MyObject x = new MyObject();

MyObject y = x.getClass().newInstance();

4.getComponentType()

该方法针对数组对象的Class对象,可以得到该数组的组成元素所对应对象的Class对象。例如:

int[] ints = new int[]{1,2,3};

Class class1 = ints.getClass();

Class class2 = class1.getComponentType();

而这里得到的class2对象所对应的就应该是int这个基本类型的Class对象

5.isArray()

判定此Class对象所对应的是否是一个数组对象。

6.Field getField(String name)//返回一个field对象,它返回class对象所表示类或接口的 指定公共成员字段,name参数是一个String

用于指定所需字段的简称

package com.yiibai;

import java.lang.reflect.*;

public class ClassDemo {

   public static void main(String[] args) {

     ClassDemo c = new ClassDemo();
     Class cls = c.getClass();
       
     System.out.println("Field =");

     try {
        // string field
        Field sField = cls.getField("string1");
        System.out.println("Public field found: " + sField.toString());
     }
     catch(NoSuchFieldException e) {
        System.out.println(e.toString());
     }
   }
  
   public ClassDemo() {
      // no argument constructor
   }

   public ClassDemo(String string1) {      
      this.string1 = string1;
   }
   
   public String string1 = "yiibai";
}
7.Field[] getFields()//不带参数,返回的是一个Field类型的数组

8.getMethods

9.getSuperclass();//取得其他类的父类

 

class hello{
    public static void main(String[] args) {
        Class<?> demo=null;
        try{
            demo=Class.forName("Reflect.Person");
        }catch (Exception e) {
            e.printStackTrace();
        }
        //取得父类
        Class<?> temp=demo.getSuperclass();
        System.out.println("继承的父类为:   "+temp.getName());
    }
}
--运行的结果是 java.lang.Object

 10.Constructor[] getConstructor()//无参构造器返回的是构造器的数组

public class Student implements Comparable{
 public String name;
 public int age;
 public Student(){
  
 }
 public Student(String name){
  this.name = name;
 }
 public Student(int age){
  this.age = age;
 }
 public Student(String name,int age){
  this.name=name;
  this.age=age;
 }

@Override
 public String toString() {
  return "Student [age=" + age + ", name=" + name + "]";
 }

}

//测试

public static void constructTest(){
  
  Constructor[]  c = null;
  Constructor  c2 = null;
  
  Student st1 = null;
  Student st2 = null;
  Student st3= null;
  Student st4= null;
  try{
   //获取所有构造器数组的方法getConstructors()
      c = Class.forName("Student").getConstructors();//获得构造器
      st1 = (Student)c[0].newInstance("11");//通过构造器获得实例,不管参数是基本类型还是引用类型
      st2 = (Student)c[1].newInstance(12);
      st3 = (Student)c[2].newInstance("aa",2);
      st4 = (Student)c[3].newInstance();

}catch(Exception e){
   e.printStackTrace();
  }

System.out.println(st1);
  System.out.println(st2);
  System.out.println(st3);
  System.out.println(st4);

}

//运行结果:

Student [age=0, name=2222]
Student [age=0, name=11]
Student [age=12, name=null]
Student [age=2, name=aa]
Student [age=0, name=null]

11.Constructor getConstructor(Class parameterType)//参数是一个参数类型的Class,比如String.class;

举例(部分截图):

 //实例1调用String(StringBuilder str)构造器
      String str = "ssseeee";    
      Constructor cc = (str.getClass()).getConstructor(class[] {StringBuilder.class});//通过传入的参数获取构造器,在实例化
      String str1 = (String)cc.newInstance(new StringBuilder("111"));//参照api,正确的写法应该是(new StringBuilder[] {new StringBuilder("111")});不过上面的写法也通过,下面也是
      System.out.println(str1);
  //实例2 Student(String str)构造器
      c2 = (Class.forName("Student")).getConstructor(class[] {String.class});
      Student sss = (Student)c2.newInstance(new String("2222"));//通过构造器获取实例,参数是根据木匾对象决定
   System.out.println(sss);

 

 

 

 

 添加一个新的链接:http://blog.csdn.net/liujiahan629629/article/details/18013523

posted @ 2016-05-15 21:30  ding9587  阅读(176)  评论(0编辑  收藏  举报