博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(CZ深入浅出Java基础)反射
阅读量:6290 次
发布时间:2019-06-22

本文共 8334 字,大约阅读时间需要 27 分钟。

这是刘意老师的JAVA基础教程的笔记

讲的贼好,附上传送门

传智风清扬-超全面的Java基础

一、类的加载

1.类初始化的时机

创建类的实例

访问类的静态变量,或者为静态变量赋值
调用类的静态方法
使用反射方式来强制创建某个类或接口对应的java.lang.Class对象
初始化某个类的子类
直接使用java.exe命令来运行某个主类

2.类加载器

2.1.作用

负责将.class文件加载到内在中,并为之生成对应的Class对象。

虽然我们不需要关心类加载机制,但是了解这个机制我们就能更好的理解程序的运行。

2.2.分类

Bootstrap ClassLoader 根类加载器

也被称为引导类加载器,负责Java核心类的加载
比如System,String等。在JDK中JRE的lib目录下rt.jar文件中

Extension ClassLoader 扩展类加载器

负责JRE的扩展目录中jar包的加载。
在JDK中JRE的lib目录下ext目录

Sysetm ClassLoader 系统类加载器

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

二、反射

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.

class类包含:

  成员变量  Field

  构造方法  Consturctor

  成员方法  Method

并且把这三个东西都看做对象

1.获取class文件对象的三种方式

public class Demo {    public static void main(String[] args) throws ClassNotFoundException {        //方式1        Person p=new Person();        Class c=p.getClass();                Person p2=new Person();        Class c2=p.getClass();                System.out.println(p==p2);        System.out.println(c==c2);                //方式2        Class c3=Person.class;                //方式3        Class c4=Class.forName("demo1.Person");//要全路径    }}

2.通过反射获取无参构造方法并使用

package demo1;import java.lang.reflect.Constructor;public class Demo {    public static void main(String[] args) throws Exception {        Class c = Class.forName("demo1.Person");// 要全路径        // 获取构造方法        System.out.println("获取public构造方法");        Constructor[] cons = c.getConstructors();        for (Constructor constructor : cons) {            System.out.println(constructor);        }        System.out.println("获取所有构造方法");        cons = c.getDeclaredConstructors();        for (Constructor constructor : cons) {            System.out.println(constructor);        }        System.out.println("运用class字节码文件获取某个构造方法对象,并创建该类的实例");        Constructor con = c.getConstructor();        Object obj=con.newInstance();        System.out.println(con);    }}class Person {    // 成员变量    private String name;    int age;    public String address;    // 构造方法    public Person() {    }    Person(String name, int age) {        this.name = name;        this.age = age;    }    public Person(String name, int age, String address) {        super();        this.name = name;        this.age = age;        this.address = address;    }    // 成员方法    public void show() {        System.out.println("show");    }    public void method(String s) {        System.out.println("method" + s);    }    public String getString(String s, int i) {        return s + "---" + i;    }    private void function() {        System.out.println("function");    }    @Override    public String toString() {        return "Person [name=" + name + ", age=" + age + ", address=" + address + "]";    }}

3.通过反射去获得含参构造方法

package demo1;import java.lang.reflect.Constructor;public class Demo {    public static void main(String[] args) throws Exception {        Class c = Class.forName("demo1.Person");// 要全路径        System.out.println("运用class字节码文件获取某个构造方法对象,并创建该类的实例");        Constructor con = c.getConstructor(String.class, int.class, String.class);        Object obj = con.newInstance("zxy",23,"Xi'an");        System.out.println(obj);    }}class Person {    // 成员变量    private String name;    int age;    public String address;    // 构造方法    public Person() {    }    Person(String name, int age) {        this.name = name;        this.age = age;    }    public Person(String name, int age, String address) {        super();        this.name = name;        this.age = age;        this.address = address;    }    // 成员方法    public void show() {        System.out.println("show");    }    public void method(String s) {        System.out.println("method" + s);    }    public String getString(String s, int i) {        return s + "---" + i;    }    private void function() {        System.out.println("function");    }    @Override    public String toString() {        return "Person [name=" + name + ", age=" + age + ", address=" + address + "]";    }}

4.获取私有构造方法

package demo1;import java.lang.reflect.Constructor;public class Demo {    public static void main(String[] args) throws Exception {        Class c = Class.forName("demo1.Person");// 要全路径        System.out.println("运用class字节码文件获取某个构造方法对象,并创建该类的实例");        Constructor con = c.getDeclaredConstructor(String.class);        con.setAccessible(true);//取消Java语言的访问检查        Object obj = con.newInstance("zxy");        System.out.println(obj);    }}class Person {    // 成员变量    private String name;    int age;    public String address;    // 构造方法    public Person() {    }    Person(String name, int age) {        this.name = name;        this.age = age;    }    private Person(String name) {        this.name = name;    }    public Person(String name, int age, String address) {        super();        this.name = name;        this.age = age;        this.address = address;    }    // 成员方法    public void show() {        System.out.println("show");    }    public void method(String s) {        System.out.println("method" + s);    }    public String getString(String s, int i) {        return s + "---" + i;    }    private void function() {        System.out.println("function");    }    @Override    public String toString() {        return "Person [name=" + name + ", age=" + age + ", address=" + address + "]";    }}

5.通过反射调用方法

package demo1;import java.lang.reflect.Constructor;import java.lang.reflect.Method;public class Demo {    public static void main(String[] args) throws Exception {        Class c = Class.forName("demo1.Person");// 要全路径        Constructor con = c.getConstructor();        Object obj = con.newInstance();        Method m1 = c.getMethod("show");//获取方法对象        m1.invoke(obj);//调用哪个对象的这个方法        Method m2 = c.getMethod("method", String.class);        m2.invoke(obj, "123");        Method m3 = c.getDeclaredMethod("function");        m3.setAccessible(true);        m3.invoke(obj);    }}class Person {    // 成员变量    private String name;    int age;    public String address;    // 构造方法    public Person() {    }    Person(String name, int age) {        this.name = name;        this.age = age;    }    private Person(String name) {        this.name = name;    }    public Person(String name, int age, String address) {        super();        this.name = name;        this.age = age;        this.address = address;    }    // 成员方法    public void show() {        System.out.println("show");    }    public void method(String s) {        System.out.println("method" + s);    }    public String getString(String s, int i) {        return s + "---" + i;    }    private void function() {        System.out.println("function");    }    @Override    public String toString() {        return "Person [name=" + name + ", age=" + age + ", address=" + address + "]";    }}

6.通过反射调用成员变量

package demo1;import java.lang.reflect.Constructor;import java.lang.reflect.Field;public class Demo {    public static void main(String[] args) throws Exception {        Class c = Class.forName("demo1.Person");// 要全路径        Constructor con=c.getConstructor();        Object obj=con.newInstance();        Field addressField = c.getField("address");        addressField.set(obj, "xian");        System.out.println(obj);    }}class Person {    // 成员变量    private String name;    int age;    public String address;    // 构造方法    public Person() {    }    Person(String name, int age) {        this.name = name;        this.age = age;    }    private Person(String name) {        this.name = name;    }    public Person(String name, int age, String address) {        super();        this.name = name;        this.age = age;        this.address = address;    }    // 成员方法    public void show() {        System.out.println("show");    }    public void method(String s) {        System.out.println("method" + s);    }    public String getString(String s, int i) {        return s + "---" + i;    }    private void function() {        System.out.println("function");    }    @Override    public String toString() {        return "Person [name=" + name + ", age=" + age + ", address=" + address + "]";    }}

7.通过用户的增删改查和学生登录注册引入中介

三、动态代理

代理:本来应该自己做的事情,却请了别人来做,被请的人就是代理对象。

举例:春季回家买票让人代买
动态代理:在程序运行过程中产生的这个对象
而程序运行过程中产生对象其实就是我们刚才反射讲解的内容,所以,动态代理其实就是通过反射来生成一个代理

(我也没太听懂)

转载地址:http://hgkta.baihongyu.com/

你可能感兴趣的文章
python分析postfix邮件日志的状态
查看>>
Mysql-5.6.x多实例配置
查看>>
psutil
查看>>
在git@osc上托管自己的代码
查看>>
机器学习算法:朴素贝叶斯
查看>>
小五思科技术学习笔记之扩展访问列表
查看>>
使用Python脚本检验文件系统数据完整性
查看>>
使用MDT部署Windows Server 2003 R2
查看>>
Redhat as5安装Mysql5.0.28
查看>>
通过TMG发布ActiveSync
查看>>
Web服务器的配置与管理(4) 配置访问权限和安全
查看>>
C#输入法
查看>>
读书笔记:读完互联网测试经验的感受
查看>>
thinkphp中url路由
查看>>
理解面向对象过程中创造一个对象的步骤
查看>>
linux修改进程的名字
查看>>
Oracle 语法
查看>>
【NOI2010】能量采集
查看>>
错误处理和调试2 - C++快速入门31
查看>>
Poj 2299 Ultra-QuickSort
查看>>