当前位置:编程学习 > JAVA >>

java反射(Reflect)

反射的基石是 Class 类,Class 类代表的是 java 源文件通过编译后得到的字节码,

获得 Class 类型 的几种方法:

    1. 类名.class

    2. 对象名.getClass()

    3. Class.forName("类路径")


构造方法的反射:


package test;

import java.lang.reflect.Constructor;
/**
 * 
 * @描述  反射基础
 * @作者  fancy
 * @邮箱  fancydeepin@yeah.net
 * @日期  2012-8-24 <p>
 *
 */
public class ReflectApp {

    public static void main(String[] args){
       
        try {
            //取得Class
            Class<?> clazz = Class.forName("java.lang.Integer");
            //取得类中参数为String类型的构造器
            Constructor<?> constructor = clazz.getConstructor(String.class);
            //使用构造器创建一个实例对象
            Object obj = constructor.newInstance("10");
            //打印结果
            System.out.println(obj);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
   
}

后台打印输出结果:


10


成员变量的反射:


package test;

import java.lang.reflect.Field;

/**
 * -----------------------------------------
 * @描述  反射基础
 * @作者  fancy
 * @邮箱  fancydeepin@yeah.net
 * @日期  2012-8-24 <p>
 * -----------------------------------------
 */
public class ReflectApp {

    public static void main(String[] args){
       
        try {
            //创建一个Person实例对象
            Person person = new ReflectApp().new Person();
            //取得Class
            Class<?> clazz = person.getClass();
            /******** 通过反射访问 public 权限的属性变量 ********/
            //取得字段的属性名
            Field age = clazz.getDeclaredField("age");
            //设置该属性的值
            age.set(person, 22);
           
            /******* 通过反射访问 protected 权限的属性变量 *******/
            Field mail = clazz.getDeclaredField("mail");
            mail.set(person, "fancydeepin@yeah.net");
           
            /******** 通过反射访问 private 权限的属性变量 ********/
            Field name = clazz.getDeclaredField("name");
            //private修饰的变量不能直接访问,如需访问必须要将setAccessible的值设置成true,也就是强制访问,或者说是暴力访问
            name.setAccessible(true);
            name.set(person, "fancy");
            System.out.println(person);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
   
    //内部类
    public class Person {

        public    int age;
        private   String name;
        protected String mail;
       
        public int getAge() {
            return age;
        }
       
        public String getName() {
            return name;
        }
       
        public void setAge(int age) {
            this.age = age;
        }
       
        public void setName(String name) {
            this.name = name;
        }

        public String getMail() {
            return mail;
        }

        public void setMail(String mail) {
            this.mail = mail;
        }

        @Override
        public String toString() {
           
            return "Name is:" + name + ",\t Age is:" + age + ",\t Mail is:" + mail;
        }
       
    }
}

后台打印输出结果:


Name is:fancy,     Age is:22,     Mail is:fancydeepin@yeah.net


成员方法的反射:


package test;

import java.lang.reflect.Method;

/**
 * -----------------------------------------
 * @描述  反射基础
 * @作者  fancy
 * @邮箱  fancydeepin@yeah.net
 * @日期  2012-8-24 <p>
 * -----------------------------------------
 */
public class R

补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,