随笔-126  评论-247  文章-5  trackbacks-0

反射的基石是 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 ReflectApp {

    
public static void main(String[] args){
        
        
try {
            
//取得Class
            Class<?> clazz = Class.forName("test.ReflectApp");
            
//取得方法
            Method method = clazz.getDeclaredMethod("print", String.class);
            
//调用该方法
            method.invoke(clazz.newInstance(), "fancy");
        } 
catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    
public void print(int arg){
        System.out.println(
"Arg is int, value is " + arg);
    }
    
    
public void print(String arg){
        System.out.println(
"Arg is String, value is " + arg);
    }
}

后台打印输出结果:


Arg is String, value is fancy



For a simple example:

题:ArrayList<Integer> list = new ArrayList<Integer>(); 在这个泛型为 Integer 的 ArrayList 中存放一个 String 类型的对象。


个人分析:泛型的类型检查只存在编译期间,运行期间并不存在泛型类型,可以用反射来实现题设要求


package examination.topic_04;

import java.lang.reflect.Method;
import java.util.ArrayList;

/**
 * -----------------------------------------
 * @描述  测试类
 * @作者  fancy
 * @邮箱  fancydeepin@yeah.net
 * @日期  2012-8-24 <p>
 * -----------------------------------------
 
*/
/**
 * TOPIC:ArrayList<Integer> list = new ArrayList<Integer>(); 在这个泛型为Integer的ArrayList中存放一个String类型的对象。
 
*/
public class TestApp {

    
public static void main(String[] args){
    
        
/**
         * 泛型的类型检查只存在编译期间,运行期间并不存在泛型类型,可以用反射来实现题设要求
         
*/
        
try {
            ArrayList
<Integer> list = new ArrayList<Integer>();
            Method add 
= ArrayList.class.getDeclaredMethod("add", Object.class);
            add.invoke(list, 
"fancy");
            System.out.println(list.get(
0));
        } 
catch (Exception e) {
            e.printStackTrace();
        }
        
    }
    
}

后台打印输出结果:


fancy


  
posted on 2012-08-24 12:34 fancydeepin 阅读(4564) 评论(2)  编辑  收藏

评论:
# re: java 反射(Reflect) 2012-08-30 14:50 | 天津花卉
反射型的还不错  回复  更多评论
  
# re: java 反射(Reflect) 2012-09-14 10:56 | 胖子胖子
最近在看commons-beanutils,感觉很不错  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: