hang613520的博客

一个很蠢但很勤奋的Boy

JAVA的反射机制

反射机制是什么?

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

反射机制能做什么?

  • 在运行时判断任意一个对象所属的类;

  • 在运行时构造任意一个类的对象;

  • 在运行时判断任意一个类所具有的成员变量和方法;

  • 在运行时调用任意一个对象的方法;

  • 生成动态代理。

反射机制提供了什么?

    *获取类的class对象
   *获取类的Fields
   *获取类的Method
   *获取类的Constructor
   *新建类的实例
          Class<T>的函数newInstance
          通过Constructor对象的方法newInstance

实例:

通过一个对象获得完整的包名和类名
package net.xsoftlab.baike;
public class TestReflect{
TestReflect testReflect = new TestReflect ();
System.out.println(testReflect .getClass().getName());
// 结果 net.xsoftlab.baike.TestReflect
}


2.实例化Class类对象:
 package new.xsoftlab.baike;
 public class TestReflect {
public static void main(String[] args) throws Exception {
//Class<?>代表类的通配符,可以代表任意类型
Class<?> class1 = null;
Class<?> class2 = null;
Class<?> class3 = null;


// 一般采用这种形式
class1 = class.forName("new.xsoftlab.baike;");
class2 = new TestReflect ().getClass();
class3 = TestReflect .class;
        System.out.println("类名称   " + class1.getName());
        System.out.println("类名称   " + class2.getName());
        System.out.println("类名称   " + class3.getName());
}
}
获取一个对象的父类与实现的接口:
package net.xsoftlab.baike;
import java.io.Serializable;


public class TestReflect implements Serializable{
private static final long serialVersionUID = -2862585049955236662L;
public static void main(String[] args) throws Exception{
//得到当前包类名
Class<?> clazz = Class.forName(net.xsoftlab.baike.TestReflect );
//获取父类名
Class<?> parentClass = clazz.getSuperClass();
System.out.println("clazz的父类为:" + parentClass.getName());//考虑clazz的父类是什么?
//获得的父类名是Object,因为我们没有继承别的类,所以所有的类的默认父类都是Object。
                   //获取所有的接口
Class<?> intes[] = clazz.getInterfaces();
System.out.println("clazz实现的接口有:");
for(int i =0;i<intes.length;i++){
System.out.println(intes[i].getName());
}
}
}


获取某个类中的全部构造函数 - 详见下例
通过反射机制实例化一个类的对象


package net.xsoftlab.baike;
import java.lang.reflect.Constructor;
public class TestReflect {
public static void main(String[] args) throws Exception {
//第一种方法,直接实例化
Class<?> class1 = null;
//得包类名
class1 = Class.forName("net.xsoftlab.baike.User");
//实例化构造函数
User user = (User)class1.newInstance();
//调用set进行赋值
user.setAge(20);
user.setName("GOOD BOY");
System.out.println(user);
// 结果 User [age=20, name=Rollen]


//第二种方法,取得全部的构造函数,使用构造函数赋值
Constructor<?> cons[] = class1.getConstructor();
//查看每个构造函数
for(int i = 0;i<cons.length;i++){
Class<?> clazzs = cons[i].getParameterTypes();
System.out.print("con[+ i + ]"+" (");
  for(int j=0;j<clazzs.length;j++){
if(j == clazzs.length - 1){
System.out.print(clazzs[j].getName());}
else{
System.out.print(clazzs[j].getName());
}
}
user = (User)cons[0].newInstance("good boy");
System.out.print(user);
user = (User)cons[1].newInstance(20,"GOOD boy");
System.out.print(user);
}
}
}
class User {
    private int age;
    private String name;
    public User() {
        super();
    }
    public User(String name) {
        super();
        this.name = name;
    }
    public User(int age, String name) {
        super();
        this.age = age;
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return "User [age=" + age + ", name=" + name + "]";
    }
}



转载学习至:http://www.cnblogs.com/lzq198754/p/5780331.html

阅读更多
想对作者说点什么? 我来说一句

Java反射机制 Java反射机制

2008年12月28日 20KB 下载

Java反射机制

2011年10月10日 188KB 下载

java反射机制与动态代理

2010年03月28日 250KB 下载

Java反射机制课件ppt

2010年06月28日 268KB 下载

JAVA 反射机制应用

2008年10月17日 124KB 下载

java反射机制教程

2009年07月24日 202KB 下载

java反射原理

2011年07月04日 450KB 下载

没有更多推荐了,返回首页

不良信息举报

JAVA的反射机制

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭