码迷,mamicode.com
首页 > 编程语言 > 详细

javase(13)_反射

时间:2015-12-25 13:28:37      阅读:215      评论:0      收藏:0      [点我收藏+]

标签:

一、概述

1、java反射机制是在运行状态中,对于任意一个类,都能知道这个类的所有属性和方法.简而言之,动态获取类中信息就是反射.

2、java反射应用在很多java软件和框架中,例Tomcat,提供了处理请求和应答的方式,因为具体的处理动作不同,所以对外提供了接口,由开发者来实现具体的请求和应答处理.这个接口就是servlet,开发者只要实现servlet接口,并配置相应的配置文件,对Tomcat来说就是在web.xml中配置servletname也就是类名,这样tomcat就能通过所谓的反射来加载该类的class文件,并获取类中的所有信息,从而实现开发者自定义的请求和应答处理方式.开发玩接口+配置文件.

二、Class对象

1、类用来描述对象共性的信息,用来描述字节码文件的共性的类是Class类,该类提供获取字节码文件中的内容,包括类名称,属性和函数.反射依靠该类来完成.

2、获取字节码文件对象的三种方式:

  1.Object类的getClass()方法,必须明确具体的类,麻烦.

  2.任何数据类型都具备一个class静态属性来获取对于的Class对象.

  3.通过给定的类的字符串名称就可以获取该类Class对象,更易扩展,该方法是forName(). 一般使用这种

  例:String name="cn.itcast.Person"; Class c = Class.forName(name);

三、获取Class中的构造函数

import java.lang.reflect.Constructor;

class Person{
    String name;
    int age;
    public Person(){
        System.out.println("wu can");
    }
    public Person(String name,int age){
        System.out.println("you can");
    }
}

public class TestPerson {
    public static void main(String[] args) throws Exception{
        //根据被new类的名称查找该类的字节码文件,加载进内存,创建该字节码文件对象,创建对应的Person对象.
        Person p = new Person();
        //根据字符串的名称查找该类的字节码文件,加载进内存,创建该字节码文件对象,创建对应的Person对象.
        String name="com.czbk.faceObjcet.Person";
        Class clazz = Class.forName(name);
        //只能调用无参构造函数
        Person p1 =(Person)clazz.newInstance();  
        //调用有参构造函数,getDeclaredConstructor可获取私有构造函数
        Constructor c = clazz.getConstructor(String.class,int.class);
        Object o=c.newInstance("ww",26);
    }
}

四、获取Class中的字段

public class TestPerson {
    public static void main(String[] args) throws Exception{
        String str="com.czbk.faceObjcet.Person";
        Class clazz = Class.forName(str);
        Object o = clazz.newInstance();
        Field f = clazz.getField("name");  //只能获取公有属性,可获取父类
        Object obj = f.get(o);
        
        Field f1 = clazz.getDeclaredField("age");//可获取私有属性,只限本类
        f1.setAccessible(true); //对私有字段的访问取消权限检查,暴力访问
        System.out.println(f1.get(o));
        f1.setInt(o,22);
        System.out.println(o);
    }
}

五、获取Class中的方法

public class TestPerson {
    public static void main(String[] args) throws Exception{
        String str="com.czbk.faceObjcet.Person";
        Class clazz = Class.forName(str);
        Object o = clazz.newInstance();
        //调用无参方法
        Method method=clazz.getMethod("toString", null);
        method.invoke(o, null);
        //调用有参方法
        Method method1=clazz.getMethod("toString1", String.class);
        method1.invoke(o, "sss");
    }
}

六、主板运行实例(接口+配置)

public interface PCI {
    void run();
    void close();
}
public class SoundCard implements PCI{
    public void run() {
        System.out.println("SoundCard Run");
    }
    public void close() {
        System.out.println("SoundCard Close");
    }
}
public class NetCard implements PCI{
    public void run() {
        System.out.println("NetCard run");
    }
    public void close(){
        System.out.println("NettCard clase");
    }
}
public class MainBoard {
    /*public void run(PCI p){
        p.run();
    }
    public void clase(PCI p){
        p.close();
    }*/
    public static void main(String[] args) throws Exception {
        //这种方式每次增加新硬件时都需要修改主板源代码
        /*SoundCard sc = new SoundCard();
        MainBoard mb = new MainBoard();
        mb.run(sc);
        mb.clase(sc);*/
        
        //增加硬件无需修改MainBoard源代码,只要在配置文件中添加
        Properties pt = new Properties();
        FileInputStream is = new FileInputStream(new File("PCI.properties"));
        pt.load(is);
        
        for(int x=0;x<pt.size();x++){
            String PCIName=pt.getProperty("pci"+x);
            Class clazz = Class.forName(PCIName);
            PCI p=(PCI)clazz.newInstance();
            Method method = clazz.getMethod("run", null);
            method.invoke(p, null);
        }
    }
}

 

javase(13)_反射

标签:

原文地址:http://www.cnblogs.com/wangweiNB/p/4833094.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!