美文网首页
java笔记--反射机制

java笔记--反射机制

作者: 吃饱喝足搬代码丶 | 来源:发表于2018-11-29 21:58 被阅读0次
java反射机制:

在运行状态中,对于任意一个类(class文件),都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态掉作用对象的方法的功能成为Java的反射机制--动态获取类中的信息,可理解为对类的解剖。

public class Person {
    
    private int age;
    private String name;
    public Person(String name,int age) {
        super();
        this.age = age;
        this.name = name;
    }
    public Person() {
        super();
        System.out.println("person run");
    }
    
    public void show(){
        System.out.println(name+"...show run..."+age);
    }
    
    private void privateMethod(){
        System.out.println("method run");
    }
    
    public void paramMethod(String str,int num){
        System.out.println("paramMethod run..."+str+":"+num);
    }
    
    public static void staticMethod(){
        System.out.println("static method run..");
    }
}
要想对字节码文件进行解剖,必须要有字节码文件对象。
public class ReflectDemo {

    public static void main(String[] args) throws ClassNotFoundException {
        
        getClassObject_1();
        getClassObject_2();
        getClassObject_3();

    }
    
    /*
    3,只要通过给定的类的字符串名字就可以获取该类,扩展性更强。
    可用Class类中的方法--forName完成。
    这种方式只要有名称即可。
     */
    public static void getClassObject_3() throws ClassNotFoundException {

        String className="cn.itcast.bean.Person";
        
        Class clazz=Class.forName(className);
        
        System.out.println(clazz);
    }
    
    /*
    2,任何数据类型都具备一个静态的属性.class来获取其对应的Class对象。
    相对简单,但还是要明确类中的静态成员。
    扩展性不够。
    */
    public static void getClassObject_2() {
        
        Class clazz=Person.class;
        
        Class clazz1=Person.class;
        
        System.out.println(clazz==clazz1);
        
    }
    
    /*
    获取字节码对象的方式:
    1,Object类中的getClass方法。
    想要用这种方式,必须明确具体的类,并创建对象
    麻烦
    */
    public static void getClassObject_1() {
        
        Person p=new Person();
        Class clazz=p.getClass();
        
        Person p1=new Person();
        Class clazz1=p1.getClass();
        
        System.out.println(clazz==clazz1);
    }

}
运行:
public class ReflectDemo2 {
    
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, Exception {

        createNewObject_2();
        
    }
    
    public static void createNewObject_2() throws Exception {
        
//      cn.itcast.bean.Person p = new cn.itcast.bean.Person("小强",39);
        
        /*
         * 当获取指定名称对应类中的所体现的对象时,
         * 而该对象初始化不使用空参数构造该怎么办呢?
         * 既然是通过指定的构造 函数进行对象的初始化,
         * 所以应该先获取到该构造函数。 通过字节码文件对象即可完成。
         * 该方法是:getConstructor(paramterTypes);
         * 
         */
        String name = "cn.itcast.bean.Person";
        //找寻该名称类文件,并加载进内存,并产生Class对象。
        Class clazz = Class.forName(name);
        //获取到了指定的构造函数对  象。
        Constructor constructor = clazz.getConstructor(String.class,int.class);
        
        //通过该构造器对象的newInstance方法进行对象的初始化。
        Object obj = constructor.newInstance("小明",38);
        
    }

    public static void createNewObject() throws ClassNotFoundException, InstantiationException, IllegalAccessException{
        
        
        //早期:new时候,先根据被new的类的名称找寻该类的字节码文件,并加载进内存,
//      并创建该字节码文件对象,并接着创建该字节文件的对应的Person对象.
//      cn.itcast.bean.Person p = new cn.itcast.bean.Person();
        
        //现在:
        String name = "cn.itcast.bean.Person";
        //找寻该名称类文件,并加载进内存,并产生Class对象。
        Class clazz = Class.forName(name);
        //如何产生该类的对象呢?
        Object obj  = clazz.newInstance();  
    }
}
运行:
public class ReflectDemo3 {

    public static void main(String[] args) throws Exception {
        
        getFieldDemo();
        
    }

    /*
     * 获取字节码文件中的字段。
     */
    public static void getFieldDemo() throws Exception {
        
        Class clazz = Class.forName("cn.itcast.bean.Person");
        
        Field field = null;//clazz.getField("age");//只能获取公有的,
        
        field = clazz.getDeclaredField("age");//只获取本类,但包含私有。 
        
        //对私有字段的访问取消权限检查。暴力访问。
        field.setAccessible(true);
        
        Object obj = clazz.newInstance();
        
        field.set(obj, 89);
        
        
        Object o = field.get(obj);
        
        System.out.println(o);
        
//      cn.itcast.bean.Person p = new cn.itcast.bean.Person();
//      p.age = 30;
        
    }   
}
运行:
public class ReflectDemo4 {

    public ReflectDemo4() {
    }
    
    public static void main(String[] args) throws Exception {

        getMethodDemo_3();
        
    }
    
    

    public static void getMethodDemo_3() throws Exception {
        
        Class clazz = Class.forName("cn.itcast.bean.Person");
        
        Method method = clazz.getMethod("paramMethod", String.class,int.class);
        
        Object obj = clazz.newInstance();
        
        method.invoke(obj, "小强",89);
        
        
    }

    public static void getMethodDemo_2() throws Exception {
        
        Class clazz = Class.forName("cn.itcast.bean.Person");
        
        Method method = clazz.getMethod("show", null);//获取空参数一般方法。
        
//      Object obj = clazz.newInstance();
        Constructor constructor = clazz.getConstructor(String.class,int.class);
        Object obj = constructor.newInstance("小明",37);
        
        method.invoke(obj, null);   
    }

    /*
     * 获取指定Class中的所有公共函数。
     */
    public static void getMethodDemo() throws Exception {
        
        Class clazz = Class.forName("cn.itcast.bean.Person");
        
        Method[] methods  = clazz.getMethods();//获取的都是公有的方法。 
        methods = clazz.getDeclaredMethods();//只获取本类中所有方法,包含私有。 
        for(Method method : methods){
            System.out.println(method);
        }   
    }
}
运行:
应用:
public interface PCI {
    
    public void open();
    public void close();

}
public class SoundCard implements PCI {
    public void open(){
        System.out.println("sound open");
    }
    public void close(){
        System.out.println("sound close");
    }

}
public class NetCard implements PCI {

    @Override
    public void open() {
        System.out.println("net open");
    }

    @Override
    public void close() {
        System.out.println("net close");
    }

}
public class Mainboard {

    public void run() {
        System.out.println("main board run....");
    }

    public void usePCI(PCI p) {//PCI p = new SouncCard();
        if (p != null) {
            p.open();
            p.close();
        }
    }
}
/*
 * 电脑运行。 
 */
public class ReflectTest {
    
    public static void main(String[] args) throws Exception {

        Mainboard mb = new Mainboard();
        mb.run();
        //每次添加一个设备都需要修改代码传递一个新创建的对象
//      mb.usePCI(new SoundCard());
        //能不能不修改代码就可以完成这个动作。 
//      不用new来完成,而是只获取其class文件。在内部实现创建对象的动作。 
        
        File configFile = new File("pci.properties");
        
        Properties prop = new Properties();
        FileInputStream fis = new FileInputStream(configFile);
        
        prop.load(fis);
        
        for(int x=0; x<prop.size(); x++){
            
            String pciName = prop.getProperty("pci"+(x+1));
            
            Class clazz = Class.forName(pciName);//用Class去加载这个pci子类。 
            
            PCI p = (PCI)clazz.newInstance();
            
            mb.usePCI(p);
        }
        
        fis.close();
        
        
    }

}
配置文件:
运行:

相关文章

  • [JAVA学习笔记] 反射机制

    [JAVA学习笔记] 反射机制 Java的反射通过Class类和java.lang.reflect类库实现。通过它...

  • Java反射机制入门

    Java反射机制入门 一、什么是反射 JAVA反射机制(The JAVA reflection mechanism...

  • Java学习笔记之反射机制

    title: Java学习笔记之反射机制tag: Javacategories: Java 理论介绍 为了便于理解...

  • 反射之一

    总结内容源自一下文章粗浅看java反射机制反射机制应用实践谈谈java反射机制Java Reflection(反射...

  • 反射之二

    总结内容源自一下文章粗浅看java反射机制反射机制应用实践谈谈java反射机制Java Reflection(反射...

  • Java基础之反射

    Java基础之—反射(非常重要)Java中反射机制详解Java进阶之reflection(反射机制)——反射概念与...

  • 反射之三

    总结内容源自以下文章 粗浅看java反射机制 反射机制应用实践 谈谈java反射机制 Java Reflectio...

  • java反射机制

    java的反射机制 1 JAVA的反射机制是什么?反射机制能做什么?反射机制的优点与缺点2 认识 Class...

  • Java中反射的用途

    Java的反射机制是Java特性之一,反射机制是构建框架技术的基础所在。灵活掌握Java反射机制,对大家以后学习框...

  • 《Java编程思想》读书笔记 第十四章 02 反射

    《Java编程思想》读书笔记 第十四章 02 反射 反射机制 反射机制是在运行状态中,对于任意一个类,都能够知道这...

网友评论

      本文标题:java笔记--反射机制

      本文链接:https://www.haomeiwen.com/subject/vuuxcqtx.html