第8章 Java的反射机制、Java的代理机制、类加载

清华大学《Java语言程序设计进阶》公开课总结 点击查看:原文 本文是清华大学许斌老师的公开课:Java语言程序设计进阶 的课堂笔记,快速复习一下,时间有限,因此大量直接截图。许斌老师声明:没有配套讲义,建议参考书籍:周志明《深入理解java虚拟机》。(JUC) java.utile.concurrency 部分参考源码和技术博客。 第一章 线程(上) 1.0 导学 2.0 通过Thread类创建线程 3.0 线程的休眠 ... 阅读详情

本文是 JAVA程序设计进阶课程 和《深入理解Java 7 ——核心技术与最佳实践》第2章 Java语言的动态性 学习笔记

Java的反射机制

使用反射API的一个重要好处是可以绕过Java语言中默认的访问控制权限。

  • Java类型信息
    获取Java运行时的类型信息有两种方法
    RTTI(Run-Time Type Identification) 所有的类型检测都是在运行时进行正确性
    检查的
  • Java反射机制的定义
    Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和
    方法;对于任意一个对象,都能够调用它的方法和属性;这种动态获取信息以及动
    态调用对象的功能称为Java语言的发射机制。
  • 类 Class
    Calss 类是Java一个基础类,每装载一个新类的时候,Java虚拟机就会在Java堆中,
    创建一个Class的实例,这个实例就代表这个Class类型,通过实例获取类型信息。该类
    中的一些方法如下:
    Method[]getMethods()
    Filed[]getFileds()
    Constructor<?>[]
    getDeclaredConstructors()
  • Object 类中的方法
    hashCode()
    equals()
    clone()
    toString()
    notify()
    wait()
  • 利用Class类来创建实例
    • 创建Class类的一个对象,返回一个类的引用
      Class cls = Class.forName(”xxx“);//返回一个类型
    • 通过类的引用创建实例
      cls.newInstace();//通过newInstace创建实例,一般调用默认构造函数
package reflect;
/**
 * 利用Class 类来创建实例 传统方法
 */
class Airplane {
    @Override
    public String toString() {
        return "in airplane";
    }
}
public class CreateInstance {
    public static void main(String[] args) throws Exception {
        Class cla = null;
        Object ap ;
//      创建Class类的一个对象,描述了类Airplane 注意加上包名
        cla = Class.forName("reflect.Airplane");
        System.out.println(cla);
        ap =cla.newInstance();//创建实例的另外一种办法
        System.out.println(ap.toString());
    }
}
  • 使用反射API获取参数长度可变的构造方法
    相关的方法有4个,其中getConstructors用来获取所有的公开构造方法的列表,
    getConstructor则根据参数类型来获取公开的构造方法。另外两个对应方法
    getDeclaredConstructors和getDeclaredConstructor的作用类似,只不过它们
    会获取类中真正声明的构造方法,而忽略从父类中继承下来的构造方法。得到了
    表示构造方法的java.lang.reflect.Constructor对象之后,就可以获取关于构
    造方法的更多信息,以及通过newInstance方法创建出新的对象。
package reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

/**
 * 通过反射API可以获取到Java类中的构造方法。
 * 通过构造方法可以在运行时动态地创建Java对象,而不只是通过new操作符来进行创建。
 * @author wangbaofu
 */
public class GetConstructor {
    public GetConstructor(String... names) {
        System.out.println(names.length);
    }

    public GetConstructor(String names) {
        System.out.println(names);
    }

    public GetConstructor() {
        System.out.println("null");
    }

    public static void useGetConstructor() throws NoSuchMethodException,
            SecurityException, InstantiationException, IllegalAccessException,
            IllegalArgumentException, InvocationTargetException {
        Constructor<GetConstructor> constructor = GetConstructor.class
                .getDeclaredConstructor(String[].class);
        constructor.newInstance((Object) (new String[] { "A", "B", "C" }));
        // 获取默认构造方法
        Constructor<GetConstructor> constructor2 = GetConstructor.class
                .getDeclaredConstructor();
        constructor2.newInstance();
//      获取所有的公开构造方法的列表
        Constructor<?>[] constructors = GetConstructor.class
                .getDeclaredConstructors();
        for (Constructor<?> constructor3 : constructors) {
            System.out.println(constructor3.getParameterCount());
        }
        constructor2.newInstance();
    }

    public static void main(String[] args) {
        try {
            useGetConstructor();
        } catch (NoSuchMethodException | SecurityException
                | InstantiationException | IllegalAccessException
                | IllegalArgumentException | InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
  • 通过反射API可以获取到类中公开的静态域和对象中的实例域。
package reflect;
import java.lang.reflect.Field;
/**
 * 通过反射API可以获取到类中公开的静态域和对象中的实例域。
 得到表示域的java.lang.reflect.Field类的对象之后,
 * 就可以获取和设置域的值。与上面的构造方法类似,Class类中也有4个方法
 用来获取域,
 * 分别是getFields、getField、getDeclaredFields和getDeclaredField, 
 其含义与获取构造方法的4个方法类似。
 * 
 * 使用静态域时不需要提供具体的对象实例,使用null即可。 Field类中除了
 操作Object的get和set方法之外,还有操作基本类型的对应方法,
 * 包括getBoolean/setBoolean、getByte/setByte、getChar/setChar、
 * getDouble/setDouble、getFloat/setFloat、getInt/setInt和getLong/setLong等。
 * ,对域的获取和设置都比较简单。但是只能对类中的公开域进行操作。
 私有域没有办法通过反射API获取到,也无法进行操作 Class
 * reflect.GetFile can not access a member of class reflect.FieldContainer with
 * modifiers "private"
 * 
 */
public class GetFile {
    public static void useField() throws Exception, Exception {
        Field fieldCount = FieldContainer.class.getDeclaredField("count");
        fieldCount.set(null, 48);
        Field fieldName = FieldContainer.class.getDeclaredField("name");
        FieldContainer fieldContainer = new FieldContainer();
        fieldName.set(fieldContainer, "Bob");
        Field fieldName2 = FieldContainer.class.getField("tel");

        Field[] fields = FieldContainer.class.getFields();
        Field[] fields3 = FieldContainer.class.getDeclaredFields();
        for (Field field : fields3) {
            System.out.println(field);
        }
        /**
         * public java.lang.String reflect.FieldContainer.name public
         * java.lang.String reflect.FieldContainer.sex public static int
         * reflect.FieldContainer.count public java.lang.String
         * reflect.FieldContainer.tel
         */
        Field[] fields4 = FieldContainer.class.getFields();
        for (Field field : fields4) {
            System.out.println(field);
        }
        /**
         * fields4 public java.lang.String reflect.FieldContainer.sex public
         * static int reflect.FieldContainer.count public java.lang.String
         * reflect.FieldContainer.tel public java.lang.String
         * reflect.FiledSupper.father
         */

        for (Field field : fields) {
            System.out.println(fields);
        }
        /**
         * fields [Ljava.lang.reflect.Field;@3d4eac69
         * [Ljava.lang.reflect.Field;@3d4eac69
         * [Ljava.lang.reflect.Field;@3d4eac69
         * [Ljava.lang.reflect.Field;@3d4eac69
         */
        fieldName2.set(fieldContainer, "1883939393");
        System.out.println(fieldName2);
        /**
         * public java.lang.String reflect.FieldContainer.tel
         */

        System.out.println(fieldContainer);
        /**
         * name: Bob sex:null count:48 tel:1883939393
         */
    }

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

class FieldContainer extends FiledSupper {
    public String name;
    public String sex;
    public static int count;
    public String tel;

    @Override
    public String toString() {
        return "name: " + name + " sex:" + sex + " count:" + count + " tel:"
                + tel;
    }
}
  • 使用反射API获取和使用公开和私有方法
package reflect;

import java.lang.reflect.Method;

/**
 * 使用反射API获取和使用公开和私有方法
 * Class类中也有4个方法用来获取方法,
 * 分别是getMethods、getMethod、getDeclaredMethods和getDeclaredMethod
 *   这4个方法的含义类似于获取构造方法和域的对应方法。
 *   在 得到了表示方法的java.lang.reflect.Method类的对象之后,就可以查询该方法的详细信息
 *   比如方法的参数和返回值的类型等。最重要的是可以通过invoke方法来传入实际参数并调用该方法。
 */
public class getMethod {
    public static void useMethod() throws Exception, Exception {
        MethodContainer mc = new MethodContainer();
        Method publicMethod = MethodContainer.class
                .getDeclaredMethod("testMethod");
        publicMethod.invoke(mc);
        Method privateMethod = MethodContainer.class.getDeclaredMethod(
                "testMethod2", String.class);
        privateMethod.setAccessible(true);
        privateMethod.invoke(mc, "ss");
    }

    public static void main(String[] args) {
        try {
            useMethod();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class MethodContainer {
    public void testMethod() {
        System.out.println("null");
    }

    private void testMethod2(String str) {
        System.out.println("2");
    }
}
  • 使用反射API操作数组
package reflect;

import java.lang.reflect.Array;

/**
 * 使用反射API操作数组
 * 使用反射API对数组进行操作的方式不同于一般的Java对象,是通过专门的
 * java.lang.reflect.Array这个实用工具类来实现的 Array类中提供的方法包括创建数组和操作数组中的元素。
 * newInstance方法用来创建新的数组
 *第一个参数是数组中元素的类型,后面的参数是数组的维度信息。比如names是
 *一个长度为10的一维String数组
 * matrix1是一个3×3×3的三维数组。由于matrix2的元素类型是int[],
 */
public class UseArray {
    public void useArray() {
        String[] names = (String[]) Array.newInstance(String.class, 10);
        names[0] = "Hello";
        Array.set(names, 1, "World");
        String str = (String) Array.get(names, 0);
        int[][][] matrixl = (int[][][]) Array.newInstance(int.class, 3, 3, 3);
        matrixl[0][0][0] = 1;
        int[][][] matrix2 = (int[][][]) Array.newInstance(int[].class, 3, 4);
        matrix2[0][0] = new int[10];
        matrix2[0][1] = new int[3];
        matrix2[0][0][1] = 1;
    }
}
  • 异常类
    Java 7为所有与反射操作相关的异常类添加了一个新的父类java.lang.ReflectiveOperationException。
    在处理与反射相关的异常的时候,可以直接捕获这个新的异常。

Java的代理机制

代理模式

在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对可以在客户端和目标对象之间起到中介的作用。
代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。
代理模式一般涉及到的角色:
抽象角色:声明真实对象和代理对象的共同接口。
代理角色:代理对象角色内部含有对真实对象的引用,从而可以直接操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能够代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。
真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。

静态代理例子

package reflect;

/**
 * 静态代理的例子
 * 
 * @author wangbaofu
 * 
 */
public class Client {

    // 客户端
    public static void main(String[] args) {
        Subject subject = new ProxtSubject();
        subject.request();
    }
}
// 真实对象和代理对象的共同接口
abstract class Subject {
    public abstract void request();
}

// 真实角色
class RealSubject extends Subject {
    @Override
    public void request() {
        System.out.println("From Real Subject!");
    }
}

// 代理角色
class ProxtSubject extends Subject {
    // 代理角色对象内部含有对真实对象的引用
    private RealSubject prRealSubject;

    @Override
    public void request() {
        // 在真实角色操作之前所附加的操作
        preRequest();
        if (null == prRealSubject) {
            prRealSubject = new RealSubject();
        }
        // 真实操作完成后进行的操作
        postRequest();
    }

    private void postRequest() {
        System.out.println("postRequest()");
    }

    private void preRequest() {
        System.out.println("preRequest()");
    }
}
输出:
preRequest()
postRequest()
  • 静态代理的优缺点:
    优点:业务只需要关注业务逻辑本身,保证了业务类的重用性。
    缺点:代理对象的接口服务于一种类型的对象,如果要代理的方法很多,势必要为每一种方法都进行代理,静态代理在程序规模上稍大时就无法胜任了。
    如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法。增加了代码维护的复杂度。

Java动态代理

**java.lang.reflect.Proxy**
这是Java动态代理机制的主类,它提供了一组静态方法来为一组接口动态地生成代理类及其对象。
//该方法用于获取关联指定类加载器和一组接口的动态代理类的类对象
**static Class getProxyClass(ClassLoader loader,Class []interface )**
//该方法用于判断指定类对象是否是一个动态代理类
**static boolean isProxyClass(Class cl)**
//该方法用于为指定类装载器、一组接口及调用处理器生成动态代理类的实例
**static Object newProxyInstance(ClassLoader loader,Class[]interfaces,InvocationHandler h)**

java.lang.reflect.InvocationHandler
这是调用处理器接口,它定义了一个invoke方法,用于集中处理在动态代理类对象上的方法调用,通常在给方法中实现对委托类的代理访问
Obeject invoke(Object proxy,Method method ,Object []args)
//该方法负责集中处理处理动态代理类上的所有方法调用。第一个参数是代理类实例,第二个参数是被调用的方法对象,第三份方法是调用的参数。调用处理器根据这三个参数进行预处理或者分派到委托实例上执行
实例:

package reflect;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import javax.jws.Oneway;

/**
 * Java 动态代理实例
 * 
 */
public class Clinet2 {
    public static void main(String[] args) {
        RealSubject2 rs = new RealSubject2();// 在这里指定代理类
        InvocationHandler ds = new DynamicSubject(rs);
        Class cls = rs.getClass();// 以下是一次性生成代理
        Subject2 subject2 = (Subject2) Proxy.newProxyInstance(
                cls.getClassLoader(), cls.getInterfaces(), ds);
        subject2.request();
    }
}

// 抽象角色
interface Subject2 {
    public void request();
}

// 真实角色 :实现了Subject 的request()方法
class RealSubject2 implements Subject2 {
    public RealSubject2() {
    }

    @Override
    public void request() {
        System.out.println("From real subject.");
    }
}

// 代理角色,必须继承InvocationHandler
class DynamicSubject implements InvocationHandler {
    private Object sub;

    public DynamicSubject() {
    }

    public DynamicSubject(Object object) {
        sub = object;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        System.out.println(" before caling " + method);
        method.invoke(sub, args);
        System.out.println(" after caling " + method);
        return null;
    }
}
/**
 * 输出结果
 *  before caling public abstract void reflect.Subject2.request()
From real subject.
 after caling public abstract void reflect.Subject2.request()
 */
  • 动态代理的特点:
    包:如果所代理的接口都是public的,那么它将被定义为顶层包(即包路径为空),如果所代理的接口中有非public的接口,那么它将被定义在该接口所在包,这样的设计的目的是为了最大程度的保证动态代理类不会因为包管理的问题二无法被定义并访问;
    类修饰符:该代理类具有final和public修饰符,意味着它可以被所有的类访问,但是不能被再度继承;
    类名:格式是“$ProxyN”,其中N是一个逐一递增的阿拉伯数字,代表Proxy类第N次生成的动态代理类,值得注意的一点是,并不是每次调用Proxy的静态方法穿件动态代理类都会使得N增加,原因是如果对同一组接口
    (包括接口排列顺序相同)试图重复创建动态代理类,它会很聪明地返回先前已经创建好的代理类的对象,而不会再尝试去创建一个全新的代理类,这样可以节省不必要的代码重复生成,提高了代理类的创建效率。
    动态代理的优点和缺点
    优点:动态代理与静态代理相比较,最大的好处是接口中声明的所有方法都被转义到调用处理器一个集中的方法中处理(InvocationHandler.invoke)。这样,在接口方法数量比较多的时候,可以进行灵活处理,而不需要像代理那样每一个方法进行中转。
    缺点:Proxy已经设计的非常优美,美中不足仅支持interface代理。

类加载

  • JVM类加载的种类:
    JVM自带的默认加载器
    1.根据加载器:boostrap,由C++编写,所有的Java程序无法获得。
    2.扩展类加载器:由Java编写。
    3.系统类、应用类加载器:由Java 编写。
    用户自定义的类加载器:
    Java.lang.ClassLoader的子类,用户可以定制类的加载方式。每一个类都包含了加载它的ClassLoader的一个引用–getClassLoader()。
    如果返回的是null,证明加载它的ClassLoader是跟加载器boostrap。
    类的加载方式

    • 本地编译好的class文件直接加载
    • 网络加载:java.net.URLClassLoader可以加载仂指定的类
    • 从jar、zip等等压缩文件加载类,自动解析jar文件找到class 文件去加载。

    类加载的步骤

    • 加载 、连接、验证、准备、解析

    加载顺序
    根加载器->扩展类加载器 ->应用类加载器 -> 用户自定义类加载器
    如果到最后一层都再加载不了,就出现ClassNotFoundException异常。
    ClassLoader加载Class的过程
    第1步:检测此Class是否载入过(即在cache中是否有此Class),如果有跳到第8步,如果没有到第2步
    第2步:如果parent classloader不存在(没有parent一定是bootstrap classloader了),则跳到第4步。
    第3步:请求parent classloader载入,如果成功到第8步
    第4步:请求Jvm从bootstrap classloader 中载入,如果成功到第8步。
    第5步:寻求Class文件(从与此classLoader相关的类路径中寻找)。如果找不到则跳到第8步。
    第6步 :从文件中载入Class,到第8步
    第7步:抛出ClassNotFoundException
    第8步:返回Class

Java反射机制、代理模式和装饰器模式、IOC 1.反射机制 2.挥手握手 阅读详情

相关推荐

【WRF-CMAQ实战指南】从环境配置到测试案例运行全解析

本文详细解析了WRF-CMAQ从环境配置到测试案例运行的全过程,包括系统环境检查、依赖库安装、源码获取与项目初始化、关键配置技巧、编译实战与排错、测试案例运行验证等关键步骤。通过实战指南,帮助用户快速掌握WRF-CMAQ的安装和运行技巧,提升空气质量模拟的效率。

year5的博客 245

AILD知识点汇总

android、HIDL、in、out、inout

lvyaer_1122的博客 716

DPM|03Injection设置

摘要:本文介绍了CFD软件Fluent中粒子注入的设置方法。粒子注入是将离散颗粒引入连续相的过程,可用于模拟灰尘、燃料液滴等。设置流程包括:选择粒子类型(质量less、惰性等)、定义注入点属性(坐标、时间、粒径等)、处理多组分粒子、使用文本文件批量定义复杂注入。文中还详细说明了要考虑的湍流影响,包括随机追踪法模拟湍流扩散,以及粒子旋转建模等注意事项。最后介绍了多种注入类型和粒子类型,并强调在湍流系统中需设置足够的尝试次数以确保结果准确性。

qq_28258217的博客 2229

oneway的定义和使用

问题现象:服务的定义,与面向对象技术中定义一个接口很类似,而这些接口其实就是纯虚函数。thrift编译工具会根据服务的定义来产生相应的方法和函数。 每个服务,都包括了若干个函数,每个函数包括了若干个参数和一个返回值(返回值可以是void)。 问题改进:返回值为void的函数,你可以在函数名前加上oneway标识符,将此函数以异步模式执行,这样在调用此函数后,函数会立即返回。 对于返回void的函数,thrift仍然会确保函数返回,这样表示这个函数被正确执行,且服务端已有返回信息了。但是如果给void的

gengyiping18的专栏 2517

可变形卷积(Deformable Conv)原理解析与torch代码实现

图6为可变形卷积示意图。图1所示为普通卷积在输入特征图上进行卷积计算的过程,卷积核大小为3*3,在输入特征图尺寸为7*7上进行卷积,将卷积核权重与输入特征图对应位置元素相乘并求和得到输出特征图元素,按一定方式滑动窗口就能计算得到整张输出特征图。图6所示,在input feature map上普通卷积操作对应卷积采样区域是一个卷积核大小的正方形(绿框),而可变形卷积对应的卷积采样区域为一些蓝框表示的点,这就是可变形卷积与普通卷积的区别。先来一张图感受一下,图3为标准卷积与可变形卷积的卷积示例。

panghuzhenbang的博客 5万+

processing与arduino互动编程

Arduino开发板对AVR单片机二次编译封装,无需考虑单片机编程寄存器、地址指针等复杂细节processing借助arduino读取各种传感器的数值,控制各种机电装置。

weixin_45679408的博客 824

【Kafka】消息的同步发送和异步发送

文章目录概述1. sync vs async2. 可靠性机制2.1 oneway3. 一般配置参考 概述 kafka有同步(sync)、异步(async)以及oneway这三种发送方式,某些概念上区分也可以分为同步和异步两种,同步和异步的发送方式通过“producer.type”参数指定,而oneway由“request.require.acks”参数指定。 1. sync vs async 在官方文档Producer Configs中有如下: 翻译过来就是: producer.type的默认值是syn

m0_45406092的博客 1万+

如何让 Mac mini 24小时不休眠运行 OpenClaw

如果 OpenClaw 每 5-10 分钟自动退出,launchd 连续 4 次快速重启后会判定为崩溃循环并卸载服务。:方案一(pmset)+ 方案三(launchd)组合使用,既防止系统休眠,又保证 OpenClaw 开机自启和崩溃自动恢复。:caffeinate 只在进程运行期间有效,终端关闭或进程结束后系统恢复正常睡眠策略。这条命令会自动创建 launchd plist 并启用服务,是最推荐的方式。替换为你的实际用户名路径,Node.js 路径也要改成你自己的。确保 plist 中有。

Maynor的博客 2226

Oneway接口

而如果使用Oneway接口,业务系统在发送日志请求后可以直接返回,不需要等待中心服务器的响应,从而提高了系统的性能和响应速度。在定义接口时,可以在方法声明中使用oneway关键字来指示该方法为单向方法,即调用方发送请求后不需要等待服务方的响应,直接继续执行后续操作。因为Oneway接口不需要等待服务方的响应,所以调用方可以快速发送多个请求并立即返回,而不需要等待每个请求的响应。在使用该接口时,调用方可以调用sendDataToServer方法,发送数据到服务器,而不需要等待服务器的响应。

我的博客 730

YOLOv13优化Faster_Block:卷积(Partial Convolution)、多层感知机(MLP)结构和残差连接

Faster_Block 代表了现代深度学习中效率与性能平衡的一个典型案例。它通过部分卷积技术巧妙地减少了计算开销,同时通过精心设计的架构保持了强大的特征学习能力。这种设计思想对于移动端部署、实时应用和大规模模型训练都具有重要意义。 未来的发展方向可能包括更智能的动态分割策略、与新兴硬件的深度适配,以及与其他先进技术(如自注意力机制、神经架构搜索等)的结合。Faster_Block 的成功展示了在深度学习领域,创新往往来自于对问题本质的深刻理解和巧妙的工程实现。

FJN110的博客 430

【数据集4】GSWP3数据集详解

简介GSWP3数据集

WW、forever的博客 1368

Binder 专题24——AIDL 关键字 in out inout oneway 解析

本文摘要: AIDL中的in、out、inout和oneway关键字解析: 方向标签: in:数据仅从客户端流向服务端(默认) out:数据仅从服务端流向客户端 inout:数据双向流通 oneway: 使方法变为异步调用 Java实现细节: in参数会写入Parcel对象传输 out参数仅接收返回数据 inout实现双向数据交换 通过Parcelable接口实现跨进程对象传输 示例展示了Book类的Parcelable实现和IHelloService接口的AIDL定义,通过aidl工具生成对应的Java代

似霰的博客 900

蓝标传媒PHP面试题(带答案)

例如数组A【1,3,5,7,9】,数组B【0,2,4,6,8】,第N个数为4,第N+1个位5。(当天最早动作时间:该时间从右侧无限接近00:00,例如00:01分早于00:02)(当天最晚动作时间:该时间从左侧无限接近00:00,例如23:59分晚于23:58)(当天最早动作时间:该时间从右侧无限接近05:00,例如05:01分早于05:02)(当天最晚动作时间:该时间从左侧无限接近05:00,例如04:59分晚于04:58)B.如果你的解法时间复杂度为O(logN),请考虑时间复杂度更低的算法。...

phpstory的博客 388

JAVA SE学习笔记(五)Java反射原理和代理机制

1 类的加载、连接和初始化 1.1 JVM和类 1.2 类的加载 1.3 类的连接 1.4 类的初始化 1.5 类初始化的时机 2 类加载器 2.1 简介 2.2 类加载机制 3 反射 3.1 通过反射分析类 3.1.1 获得Class对象 3.1.2 从Class中获取信息 3.1.3 Java 8新增的方法参数反射 3.2 通过反射操作类 3.2.1 创建对象 3.2.2 调用...

源圈 279

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

java JDK8 学习笔记——第17章 反射与类加载器

第十七章 反射与类加载器 17.1 运用反射 反射:.class文档反映了类基本信息,从Class等API取得类信息的方式称为反射。 17.1.1 Class与.class文档 1、java.lang.Class的实例代表Java应用程序运行时加载的.class文档,类、接口、Enum等编译过后,都会生成.class文档。Class类没有公开构造函数,实例时候JVM自动产生,每个.cl...

weixin_30274627的博客 176

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

SOFA RPC源码解析之RPC代理机制

1.SOFA RPC源码解析 1.1  RPC代理机制         在SOFA RPC中,服务引用采用代理模式把本地方法调用转换为远程服务调用,从而使开发者像使用本地Java方法一样,使用远程服务,屏蔽了底层的网络通讯细节,使开发人员把精力集中在业务开发中。         简单回顾一下代理模式,以便大家理解SOFA RPC中代理机制的实现方式。         代理模式是常用的设计模...

闲来无事 1789

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Java 反射机制,动态代理的原理

Java 反射机制,动态代理的原理 文章目录Java 反射机制,动态代理的原理反射机制动态代理面试考点反射面试考察知识扩展1、 反射机制及其演进2、动态代理实际开发中对比各自优势。JDK Proxy 的优势:基于类似 cglib 框架的优势:应用场景: 反射机制 反射机制是 Java 语言提供的一种基础功能,赋予程序在运行时自省(introspect,官方用语)的能力。通过反射我们可以直接操作类或...

Brave Soul Blog 754

八股——Java基础(三)

Java基础包装类型、反射部分

m0_62909831的博客 1120

Java 反射机制与框架的那点事

Java 反射机制是 Java 语言提供的一种能力,允许程序在运行时查询、访问和修改它自己的结构和行为。反射机制非常有用,但同时也需要谨慎使用,因为它可能会带来性能开销和安全风险。

modelsetget的博客 572

java编程思想学习_第14章_类型信息

抽象父类中定义toString为abstract则能强制使子类重写该方法。

nash885的博客 297

java中的注解以及与Spring Aop的融合

/ 使用元注解定义我们的自定义注解@Target(ElementType.METHOD) // 这个注解只能用在方法上@Retention(RetentionPolicy.RUNTIME) // 这个注解在运行时可用,以便通过反射读取// 注解的成员。看起来像方法,但实际上定义了注解的参数。// 可以使用 default 提供默认值// 一个名为 value 的特殊参数,使用时可以省略参数名。

weixin_73866229的博客 1569

Java反射机制与动态代理的原理是什么?

典型回答 反射机制是Java语言提供的一种基础功能,赋予程序在运行时自省(introspect,官方用语)的能力。通过反射我们可以直接操作类或者对象,比如获取某个对象的类定义,获取类声明的属性和方法,调用方法或构造对象,甚至可以运行时修改类定义。 动态代理是一种方便运行时动态构建代理、动态处理代理方法调用的机制,很多场景都是利用类似机制做到的。比如用来包装RPC调用、面向切面的编程(AOP)。...

qweqwruio的博客 3504

Java 代理机制

本文纯属搬运,参考以下文章(侵删,请联系): Java代理机制与hook: http://www.zengye.cc/2016/05/01/java%E4%BB%A3%E7%90%86%E6%9C%BA%E5%88%B6%E4%B8%8Ehook/ Java三种代理模式:静态代理、动态代理和cglib代理: https://segmentfault.com/a/119...

MachineRandy 1195

[4-02-04].第04节:工作原理 - MyBatis中的接口代理机制及使用

1.基于上述工具类GenerateDaoProxy类可以动态生成接口的实现类,所以对于AccountDao的实现类AccountDaoImpl就不用手动写了,利用javassist编写一个工具类GenerateDaoProxy,用来动态生成AccountDaoImpl2.注意:实际上Mybatis已经内置了javassist,直接使用即可,不需要在引入javassist依赖3.重点:sql语句的id是框架使用者提供的,具有多变性。对于框架的开发人员来说,不知道。

F-T-er 374

Java文章汇总

目录 Java 中文api javase6 http://download.oracle.com/technetwork/java/javase/6/docs/zh/api/index.html 基本类型 基本数据类型与表达式 字面量的概念 用整数类型处理货币 类、对象及方法 类与对象 使用package-info类为包服务 类、对象、接口 对象序列化 字符串 学习...

我叫王哈哈 1000
上一篇: 类与对象
下一篇: 遵守普遍接受的命名规范
我叫王哈哈
博客等级 码龄11年 36粉丝 98原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值