Fork me on GitHub

一天一个Java基础——反射

1.概念

  反射主要是指程序可以访问,检测和修改它本身的状态或行为的一种能力

  Java中的反射是一种强大的工具,它能够创建灵活的代码,这些代码可以运行时装配,无须在组件之间进行链接

  反射允许在编写与执行时,使程序代码能够接入装载到JVM中的类的内部信息,而不是源代码中选定的类协作的代码

  如果使用不当,反射的成本会很高

2.例子

  1 package Test;
  2 
  3 import java.lang.reflect.Constructor;
  4 import java.lang.reflect.Field;
  5 import java.lang.reflect.Modifier;
  6 
  7 interface TestInterface{
  8     public static String username = "zhengbin";
  9     public static String password = "19950906";
 10     public String add();
 11     
 12 }
 13 
 14 class Demo implements TestInterface{
 15     private String username;
 16     private String password;
 17     
 18     public Demo() {
 19         super();
 20     }
 21 
 22 //    public Demo(String username, String password) {
 23 //        super();
 24 //        this.username = username;
 25 //        this.password = password;
 26 //    }
 27 
 28     public String getUsername() {
 29         return username;
 30     }
 31     public void setUsername(String username) {
 32         this.username = username;
 33     }
 34     public String getPassword() {
 35         return password;
 36     }
 37     public void setPassword(String password) {
 38         this.password = password;
 39     }
 40     public String toString() {
 41         return "Demo [username=" + username + ", password=" + password + "]";
 42     }
 43     public String add(){
 44         return "add()";
 45     }
 46 }
 47 
 48 public class Test1 {
 49 
 50     public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
 51         Demo d = null;
 52         /*    Class 在API中的解释:
 53          * 
 54          *  Class 类的实例表示正在运行的 Java 应用程序中的类和接口
 55          *  每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象
 56          *  基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也表示为 Class 对象
 57          *  Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的
 58          *  
 59          */
 60         Class<?> c = Class.forName("Test.Demo");
 61         System.out.println(c.getName());
 62 
 63         d = (Demo)c.newInstance();
 64         d.setUsername("zhengbin");
 65         d.setPassword("19950906");
 66         System.out.println(d);
 67         
 68         // 获得反射类的父类
 69         System.out.println(d.getClass().getSuperclass().getName());
 70         
 71         // 获得类中的全部构造函数
 72         Constructor<?> cons[] = c.getConstructors();
 73         for(int i = 0;i < cons.length;i++){
 74             System.out.println(cons[i]);
 75         }
 76         
 77         System.out.println("---------本类的所有属性----------");
 78         // 获得本类的所有属性
 79         Field[] field = c.getDeclaredFields();
 80         for (int i = 0; i < field.length; i++) {
 81             // 权限修饰符
 82             int mo = field[i].getModifiers();
 83             // 获得属性名
 84             String priv = Modifier.toString(mo);
 85             // 属性类型
 86             Class<?> type = field[i].getType();
 87             System.out.println(priv + " " + type.getName() + " "
 88                     + field[i].getName() + ";");
 89         }
 90         
 91         System.out.println("---------实现的接口或者父类的属性----------");
 92         // 取得实现的接口或者父类的属性
 93         Field[] filed1 = c.getFields();
 94         for (int j = 0; j < filed1.length; j++) {
 95             // 权限修饰符
 96             int mo = filed1[j].getModifiers();
 97             String priv = Modifier.toString(mo);
 98             // 属性类型
 99             Class<?> type = filed1[j].getType();
100             System.out.println(priv + " " + type.getName() + " "
101                     + filed1[j].getName() + ";");
102         }
103     }
104     
105 }

运行结果:

Test.Demo
Demo [username=zhengbin, password=yqxx950906]
java.lang.Object
public Test.Demo()
---------本类的所有属性----------
private java.lang.String username;
private java.lang.String password;
---------实现的接口或者父类的属性----------
public static final java.lang.String username;
public static final java.lang.String password;

 

例二:

  现在要求: 

  (1) 你不能使用 HelloWorld hw = new HelloWorld(),但是要构建一个HelloWorld的实例来

  (2) 调用 sayHello() 方法,但是不能直接用 HelloWorld实例的 hw.sayHello() 方法

 1 package Test;
 2 
 3 import java.lang.reflect.Method;
 4 
 5 public class Test2 {
 6     
 7     @org.junit.Test
 8     public void test1(){
 9         try {
10             Class c = Class.forName("Test.Say");
11             Object o = c.newInstance();
12             
13             Method m = c.getDeclaredMethod("sayHello");
14             m.invoke(o);
15             
16             Method m1 = c.getDeclaredMethod("sayName", String.class);
17             m1.invoke(o, "zhengbin");
18         } catch (Exception e) {
19             e.printStackTrace();
20         }
21     }
22     
23 }
24 
25 class Say{
26     public void sayHello(){
27         System.out.println("Hello World");
28     }
29     public void sayName(String name){
30         System.out.println("Hello "+name);
31     }
32 }

运行结果:

Hello World
Hello zhengbin

 

详情:http://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html

  http://mp.weixin.qq.com/s?__biz=MzAxOTc0NzExNg==&mid=406392698&idx=1&sn=841f236f636e65a6b501ff79bb562aa1&scene=23&srcid=0409vaYyVB4IzSHV11seyPGA#rd

posted @ 2016-04-02 08:51  郑斌blog  阅读(530)  评论(0编辑  收藏  举报