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();

关于反射和动态代理和AOP的更多相关文章

  1. 动态代理和AOP

    之前说过了我对IOC的理解,这篇文章说以下我对动态代理和基本的对AOP的理解. 所谓动态代理就是,在运行时,动态创建实现了一组指定接口的实现类对象. 比如有: interface A { } inte ...

  2. java反射 java动态代理和cglib动态代理的区别

    java反射      https://blog.csdn.net/f2764052703/article/details/89311013 java 动态代理   https://blog.csdn ...

  3. 18.5.2动态代理和AOP

    ----此处是JDK动态代理----package d18_5_2; public interface IDog { void info(); void run(); } package d18_5_ ...

  4. java 编程基础 Class对象 反射:动态代理 和AOP:java.lang.reflect.Proxy:(Proxy.newProxyInstance(newProxyInstance​(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h))

    为什么我们使用动态代理 静态代理会让类变多了,多了代理类,工作量变大了,且不易扩展.比如我们上节课的例子,要实现不同的扩展方法就要编写不同的代理类,非常麻烦.   Proxy类的使用规则 Proxy提 ...

  5. Spring中AOP的两种代理方式(Java动态代理和CGLIB代理)

    第一种代理即Java的动态代理方式上一篇已经分析,在这里不再介绍,现在我们先来了解下GCLIB代理是什么?它又是怎样实现的?和Java动态代理有什么区别? cglib(Code Generation ...

  6. Spring中AOP的两种代理方式(Java动态代理和CGLIB代理-转载

    内容是摘抄的,不知最初的原作者,见谅 Java 动态代理.具体有如下四步骤: 通过实现 InvocationHandler 接口创建自己的调用处理器: 通过为 Proxy 类指定 ClassLoade ...

  7. JAVA高级架构师基础功:Spring中AOP的两种代理方式:动态代理和CGLIB详解

    在spring框架中使用了两种代理方式: 1.JDK自带的动态代理. 2.Spring框架自己提供的CGLIB的方式. 这两种也是Spring框架核心AOP的基础. 在详细讲解上述提到的动态代理和CG ...

  8. AOP的底层实现-CGLIB动态代理和JDK动态代理

    AOP是目前Spring框架中的核心之一,在应用中具有非常重要的作用,也是Spring其他组件的基础.它是一种面向切面编程的思想.关于AOP的基础知识,相信多数童鞋都已经了如指掌,我们就略过这部分,来 ...

  9. SpringAOP-JDK 动态代理和 CGLIB 代理

    在 Spring 中 AOP 代理使用 JDK 动态代理和 CGLIB 代理来实现,默认如果目标对象是接口,则使用 JDK 动态代理,否则使用 CGLIB 来生成代理类. 1.JDK 动态代理 那么接 ...

随机推荐

  1. symbol,iterator,generator

    1.symbol是在ES6中引入的一种基本数据类型,因为symbol是不重复.唯一的数据特性,symbol设计是被用来表示对象内部的私有属性的.     symbol.for与symbol.keyfo ...

  2. 【Linux 应用编程】进程管理 - 进程间通信IPC之共享内存 mmap

    IPC(InterProcess Communication,进程间通信)是进程中的重要概念.Linux 进程之间常用的通信方式有: 文件:简单,低效,需要代码控制同步 管道:使用简单,默认阻塞 匿名 ...

  3. C 语言的运算符

    算术运算 C 语言支持 + - * / % 五种运算,加减乘除取模. 所有 CPU 都内建加法器,可以完成加法操作.减法操作可以转为加法操作.大部分 CPU 都没有内置乘法器,此时编译器会把 * / ...

  4. $apply()和$digest()——angular

    $apply()和$digest()在AngularJS中是两个核心概念,但是有时候它们又让人困惑.而为了了解AngularJS的工作方式,首先需要了解$apply()和$digest()是如何工作的 ...

  5. 应用安全 - Web安全 - 远程控制管理工具 - 汇总

    菜刀 蚁剑 冰蝎 DarkCommet ADT windows/upexec/reverse_tcp set PEXEC xxx

  6. kafka学习(三)

    kafka 消费者-从kafka读取数据   消费者和消费者群里 kafka消费者从属于消费者群组.一个群组里的消费者订阅的是同一主题,每个消费者接受主题一部分分区的消息.如果我们往群组里添加更多的消 ...

  7. python并发编程之进程池、线程池、协程

    需要注意一下不能无限的开进程,不能无限的开线程最常用的就是开进程池,开线程池.其中回调函数非常重要回调函数其实可以作为一种编程思想,谁好了谁就去掉 只要你用并发,就会有锁的问题,但是你不能一直去自己加 ...

  8. [19/06/04-星期二] HTML基础_实体(转义字符)、图片标签(img)、元标签(meta)、语法规范、内联框架(iframe)、超链接

    一.实体(转义字符) 在HTML中,一些诸如<.> 就是普通的小于号和大于号不能直接使用,因为浏览可能会把它当成一个标签去解析,所以需要一些特殊字符去表示这些特殊字符, 这些字符我们称他们 ...

  9. CM使用MySQL数据库预处理scm_prepare_database.sh执行报错:java.sql.SQLException: Access denied for user 'scm'@'hadoop101.com' (using password: YES)

    1.报错提示: [root@hadoop101 ~]# /opt/module/cm/cm-/share/cmf/schema/scm_prepare_database.sh mysql cm -hh ...

  10. [多校联考2019(Round 4 T2)][51nod 1288]汽油补给(ST表+单调栈)

    [51nod 1288]汽油补给(ST表+单调栈) 题面 有(N+1)个城市,0是起点N是终点,开车从0 -> 1 - > 2...... -> N,车每走1个单位距离消耗1个单位的 ...