zoukankan      html  css  js  c++  java
  • 一天一个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

  • 相关阅读:
    新浪推出开放云计算平台Sina App Engine
    摄像机标定
    Qt开发环境大全
    [转]卡尔曼滤波器
    Qt Creator:跨平台 IDE
    建立交叉编译的Qt/Embeded开发环境
    Linux mmap
    QtCreator在不同平台开发的程序的运行
    粒子滤波概述
    13、几点小结,unsigned long long
  • 原文地址:https://www.cnblogs.com/zhengbin/p/5346907.html
Copyright © 2011-2022 走看看