• 关于反射和动态代理和AOP


    package Exercise.reflect;
    
    /**
     * 反射把java中所有的东西都当做对象,甚至是类的本身也作为一种对象,并把它作为Class的对象的实例;
     * 反射是把类、类的属性、方法都作为一个对象类进行剖析;

    反射机制:java在运行期间动态地获取类的内部消息,并且动态的调用类中的方法和属性的机制叫做反射; * * 为什么需要反射?把类变成活的,当一个类经过java虚拟机编译之后会生成对应的字节码文件,即xxx.class, * 而反射就是去解析这个类的信息,包括其中所包含的变量和方法; * 在运行期间去加载一个类,并对类进行剖析,甚至可以给一个类的属性动态的赋值,也可以去唤醒它的内部的方法, * * Spring容器就是用反射去加载一个类的; * * 感觉反射很神奇,抽象,它的底层到底是如何实现的?反射的底层到底是如何实现的?说获得一个类就获得一个类, * 是不是编译原理的? * 源代码→预处理器 → 编译器 → 目标代码(机器语言) → 可执行文件 * * 另外,java虚拟机的原理到底是什么?把一个类加载,并生产对应的字节码文件;java虚拟机在一定程度上已经
    替代了编译器,生成了目标文件,所以它能随处运行; *
    */ public class ClassDemo01 { public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException { //Foo实例对象 Foo foo1=new Foo(); //通过类本身的编译类获得这个类; Class c1=Foo.class; //该类对象通过getClass方法 Class c2=foo1.getClass(); System.out.println(c1==c2); //类的类类型创建该类的对象实例; Class c3=null; System.out.println(c2==c3); c3=Class.forName("Exercise.reflect.Foo"); //获得类的类类型创建该类的对象实例; Foo foo=(Foo)c1.newInstance(); foo.print(); } } class Foo{ void print(){ System.out.println("foo"); } }

     关于反射,可以参看之前写的,https://www.cnblogs.com/shijinglu2018/p/8371615.html

    疑问:Class.forName("类的全称");        Class.forName中 Class为什么可以调用forName()方法;   方法是静态的,所以可以直接调用;点进去看方法;

    Class.forName("类的全称");

    不仅表示类的类型,而且还动态的加载了类;

    编译时刻加载类是静态加载类,而运行时刻加载类是动态加载类;

    ...

     本代码摘自https://www.imooc.com/learn/199

    package com.imooc.reflect;
    
    import java.lang.reflect.Method;
    
    public class MethodDemo1 {
        public static void main(String[] args) {
           //
            A a1 = new A();
            Class c = a1.getClass();
            /*
             * 2.
             */
            try {
                //下面的写法等价于Method m =  c.getMethod("print", new Class[]{int.class,int.class});  获取方法  其中方法名为print  参数为int int 
                Method m = c.getMethod("print", int.class,int.class);
        
                //下面的写法等价于Object o = m.invoke(a1,new Object[]{10,20});调用方法,其中m代表方法; 另外,a1代表调用方法的对象,10,20是参数,o是返回值,有则返回,无则null
                //打桩输出一下Object O  在eclipse上默写该代码;
    Object o = m.invoke(a1, 10,20); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } class A{ public void print(){ System.out.println("helloworld"); } public void print(int a,int b){ System.out.println(a+b); } public void print(String a,String b){ System.out.println(a.toUpperCase()+","+b.toLowerCase()); } }

    重要思路:

    首先获得类的类类型,getClass或forName或xxx.class;

    然后调用一些方法getMethod getContructor...都是共有的,而要想本类中调用定义的所有的方法或构造器则getDeclearedMethod();

    成年人的世界没有那么多的童话,也没有那么多的逆袭。
  • 相关阅读:
    linux修改host文件
    SpringBoot RocketMQ 整合使用和监控
    Linux的五个查找命令
    github 在线创建文件和创建文件夹
    nginx 配置
    JetBrains 里不为人知的秘密(3)--快捷键篇
    java.lang.NoClassDefFoundError: Lorg/springframework/beans/factory/access/BeanFactoryReference;
    【数论】P1029 最大公约数和最小公倍数问题
    ST表学习笔记
    树状数组学习笔记
  • 原文地址:https://www.cnblogs.com/shijinglu2018/p/11343282.html
Copyright © 2020-2023  润新知