文档章节

反射

凹凸凸
 凹凸凸
发布于 09/21 16:02
字数 1012
阅读 4
收藏 0

 

类的加载

当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化来实现对这个类进行初始化

       加载: 将class文件读入内存, 并为之创建一个Class对象; 任何类被使用时系统都会建立一个Class对象

       连接

验证: 是否有正确的内部结构, 并和其他类协调一致

              准备: 负责为类的静态成员分配内存, 并设置默认初始化值

              解析: 将类的二进制数据中的符号引用替换为直接引用

       初始化

                之前的new一个对象的初始化步骤

类加载器

将class文件加载到内存,并为之生成对应的Class对象

类加载器的组成

       Bootstrap ClassLoader 根类加载器

              引导类加载器: 负责Java核心类的加载

                     比如system,String等。在JDK中JRE的lib目录下rt.jar文件中

       Extension ClassLoader 扩展类加载器

              负责JRE的扩展目录中jar包的加载

                     在JDK中JRE的lib目录下ext目录

       System ClassLoader 系统类加载器

              负责在JVM启动时加载来自Java命令的class文件,以及classpath环境变量所指定的jar包或类路径

反射: 获取class文件对象的三种方式

//方式1
Person p = new Person();
Class c = p.getClass();

Person p2 = new Person();
Class c2 = p2.getClass();
//false
System.out.println(p == p2);
//true
System.out.println(c == c2);

//方式2
Class c3 = Person.class;
//true
System.out.println(c == c3);
//方式3F:
Class c4=Class.forName("Person");
Class c4 = Class.forName("xx.xxxx.Person");

ArrayList<Integer>的一个对象,在这个集合中添加一个字符串数据,如何实现呢?

public static void main(String[] args) throws Exception {
    //创建集合对象
    ArrayList<Integer> arrayList = new ArrayList<>();
    //添加数据
    arrayList.add(120);
    //集合ArrayList的class文件对象
    Class c = arrayList.getClass();
    Method method = c.getMethod("add", Object.class);
    method.invoke(arrayList, "hello");
    method.invoke(arrayList, "world");
    method.invoke(arrayList, "java");
    arrayList.add(30);
    // public boolean java.util.ArrayList.add(java.lang.Object)
    System.out.println(method);
    // [120, hello, world, java, 30]
    System.out.println(arrayList);

}
public void setProperty(Object obj, String propertyName, Object value) throws Exception {
    //获取字节码文件对象
    Class c=obj.getClass();
    //获取该对象的propertyName的成员变量
    Field field=c.getDeclaredField(propertyName);
    //取消访问检查
    field.setAccessible(true);
    //给对象的成员变量propertyName赋值为指定的值
    field.set(obj,value);

}

 

动态代理

JDK提供的代理只能针对接口做代理
public interface UserDao {
    void add();
    void delete();
    void update();
    void find();
}
public class UserDaoImpl implements UserDao {
    @Override
    public void add() {
        System.out.println("添加功能");
    }

    @Override
    public void delete() {
        System.out.println("删除功能");
    }

    @Override
    public void update() {
        System.out.println("修改功能");
    }

    @Override
    public void find() {
        System.out.println("查找功能");
    }
}
public interface StudentDao {
    void login();
    void regist();
}
public class StudenDaotImpl implements StudentDao {
    @Override
    public void login() {
        System.out.println("登录功能");
    }

    @Override
    public void regist() {
        System.out.println("注册功能");
    }
}
public class MyInvocationHandler implements InvocationHandler{
    /**目标对象*/
    private Object target;

    public MyInvocationHandler(Object target) {
        this.target = target;
    }

    /**
     * Object invoke(Object proxy, Method method, Object[] args)
     * 在代理实例上处理方法调用并返回结果
     * @param proxy
     * @param method
     * @param args
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("权限校验");
        Object result=method.invoke(target,args);
        System.out.println("日志记录");
        // 返回的是代理对象
        return result;
    }
}

 

public static void main(String[] args) {
    UserDao ud = new UserDaoImpl();
    ud.add();
    ud.delete();
    ud.update();
    ud.find();
    /*添加功能
      删除功能
      修改功能
      查找功能*/
    System.out.println("------------");
    //我要创建一个动态代理对象 Proxy类中有一个方法可以创建动态代理对象
    //public static Object newProxyInstance(ClassLoader loader,
    //Class<?>[] interfaces,InvocationHandler h)
    //对ud对象做一个代理对象
    MyInvocationHandler handler = new MyInvocationHandler(ud);
    UserDao proxy = (UserDao) Proxy.newProxyInstance
            (ud.getClass().getClassLoader(), ud.getClass().getInterfaces(), handler);
    proxy.add();
    proxy.delete();
    proxy.update();
    proxy.find();
    /*权限校验
    添加功能
    日志记录
    权限校验
    删除功能
    日志记录
    权限校验
    修改功能
    日志记录
    权限校验
    查找功能
    日志记录*/
    System.out.println("-------------");
    StudentDao sd = new StudenDaotImpl();
    MyInvocationHandler handler1 = new MyInvocationHandler(sd);
    StudentDao proxy1 = (StudentDao) Proxy.newProxyInstance(sd.getClass().getClassLoader(),
            sd.getClass().getInterfaces(), handler1);
    proxy1.login();
    proxy1.regist();
    /*权限校验
      登录功能
      日志记录
      权限校验
      注册功能
      日志记录*/

}

© 著作权归作者所有

上一篇: 枚举
下一篇: HTTP
凹凸凸
粉丝 2
博文 39
码字总数 31833
作品 0
成都
私信 提问
JavaSE_8系列博客——专家之路(一)---Java反射的总结

先来四个基本问题: 一、什么是反射(what)? 生活中的反射 百科定义:反射(外文名reflection),指的是声波、光波或其他电磁波遇到别的媒质分界面而部分仍在原物质中传播的现象。如光的反射...

u011500356
2017/10/22
0
0
【Unity3D技术文档翻译】第3.6.7.3篇 反射探针高级特性

上一章:【Unity3D技术文档翻译】第3.6.7.2篇 使用反射探针 本章原文所在章节:【Unity Manual】→【Graphics】→【Graphics Overview】→【Lighting】→【Global Illumination】→【Reflect...

何三思
2018/08/31
0
0
Java 反射机制学习资料

Java反射——引言 Java反射——Class对象 Java反射——构造函数 Java反射——字段 Java反射——方法 Java反射——Getter和Setter Java反射——私有字段和私有方法 Java反射——注解 Java反射...

机器的心脏
2017/12/15
0
0
Java面试题精编版—反射

—动力节点java   面试题   什么是reflection?其他语言有这种特点吗?   答案:Java中的反射是一种强大的工具,它能够创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行...

忻峰作浪
2016/11/21
9
0
C#基础系列——反射笔记

前言:使用反射也有几年了,但是一直觉得,反这个概念很抽象,今天有时间就来总结下这个知识点。 1、为什么需要反射:   最初使用反射的时候,作为小菜总是不理解,既然可以通过new 一个对...

嗯哼9925
2017/11/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

开发经验 初学51单片机建议用C语言

typesetting : Markdown    blog : my.oschina.net/zhichengjiu    gitee : gitee.com/zhichengjiu   新手学习51单片机建议用C语言。因为使用C语言入门的话,上手速度快。实现几个例程后...

志成就
16分钟前
3
0
mybatis异常:nested exception is org.apache.ibatis.builder.BuilderException: Error resolving JdbcType

mybatis异常:nested exception is org.apache.ibatis.builder.BuilderException: Error resolving JdbcType 异常详细 org.mybatis.spring.MyBatisSystemException: nested exception is org......

开元中国2015
16分钟前
3
0
Hexo博客搭建

本文默认已经安装好git和node.js环境 版本说明:git version 2.16.2.windows.1 、 node.js v8.9.4 Hexo是什么   Hexo 是一个快速、简洁且高效的博客框架,这里不多介绍,丢个链接,感兴趣的...

逸竹小站
42分钟前
3
0
学习记录 Vue(模板,差值表达式,v-text,v-html,v-bind,v-model,v-if,v-show,v-for,v-on,this关键字,按键修饰符)

模板示范 <div id="d1"></div><script> new Vue({ el:"#d1", //作用的区域 data:{//参数 }, methods:{// 函数 ......

Pole丶逐
43分钟前
3
0
vue vue-router beforeRouteEnter

本文转载于:专业的前端网站➬vue vue-router beforeRouteEnter beforeRouteEnter (to, from, next) { // 在渲染该组件的对应路由被 confirm 前调用 // 不!能!获取组件实例 `thi...

前端老手
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部