JavaAdvance #03 反射与代理机制

高级特性:反射、代理         [JVM角度,看待类的运行]

思考

Q1:给定一个类的名字(字符串形式),怎么创建该类的对象。

#1.手写一个类

#2.反射:字符串,获取类,以及类对象的机制。

Q2:什么是反射机制?refelct

Q3:静态代理与动态代理的异同?

Q4:类如何进行加载

#源文件—类文件—装入内存


一、反射机制

背景:Java类型信息

#获取Java运行时的类型信息的两种方法

##1>RTTI  (Run-Time Type Identification)

##2>Java发射机制

#RTTI

##目的:运行时,识别对象的类型。    

##读取对象:类型转换是在运行时进行正确性检查  (存储:实现类 \  读取:实现类——>接口)

##优点:代码少了解对象的具体类型,只与对象家族中的一个通用表打交道

Java反射机制

定义:动态获取信息以及动态调用对象方法的功能。

在运行状态中,

对于任意一个类,都能够知道这个类的属性和方法;

对于任意一个对象,都能调用它的任意方法和属性。

内容

类Object:

类Class : Class类是Java一个基础类,每装载一次新类的时候,Java虚拟机就会在Java堆中,创建一个Class的实例,这个实例就是代表这个Class类型,通过实例获取类型信息。

类Method    

类Field:域

类Constructor:构造器

#方法对比

##Class类方法:Method[] getMethods()、Field[] getFields()、Constructor<?>[] getDeclaredConstructors

##Object类方法:hashCode()、equals()、clone()、toString()、notify()、wait()

#利用Class类创建实例

##创建Class类的一个对象,返回一个类的引用 

   [ Class类的对象,表达一个类的引用   ]

###Class cls = Class.forName("Airplane");    //返回一个类型             静态方法

##通过类的引用创建实例

###cls.newInstance();//通过newInstance创建实例,一般调用默认的构造函数

    [ 类型:Airpane,调用Airpane默认的构造方法]

#创建实例    

##传统方法   Airplane ap = new Airplane();                  已有类,创实例     动态方法         已有类创建实例

##反射方法   Class cls = Class.forName("Airplane");    创类                      静态方法         字符串创建实例

                     ap = cls.newInstance()                              创实例                   及动态方法

Method类

#Method类中invoke反射:invoke方法对带有指定参数的指定对象,调用由此Method对象表示的基础方法

  [Method类,对象,表示任意一个类中的某一个方法 \invoke()方法,调用原来类中的方法]

##>1创建方法类         Method mth = ClassA.class.getMethod(methodName,methodArgs[]);

##>2调用类方法         mth.invoke(ClassA.class.newInstance(),new ArgType1(arg1),new ArgType2(arg2));

二、静态代理

 
 
 

代码

一反射机制

1.利用Class类创建实例

Class Airplane{
    public String toString(){
        return("in airplane");
    }    
}

public class CreateInstance{
    public static void main(String[] args) throws Exception{
        Class cls = null;
        Object ap;
        cls = Class.forName("Airplane");//创建Class类的一个对象,描述了类Ariplane
        
        System.out.println(cls);
        ap = cls.newInstance();    //创建实例的另一种方法
        System.out.println(ap.toString());
    }
}

2.反射例子-Method类的invoke

Method类中的invoke反射
import java.lang.reflect.*;

public class ClassA{
    public void add(Integer param1,Integer param2){
        System.out.println(param1.intValue() + param2.intValue());
    }
    
    public void StringAdd(){
        System.out.println("out"+abc);
    }
    
    public static void main(String[] args){
        try{
            Method mth = ClassA.class.getMethod("add",
                new Class[]{ Integer.class,Integer.class});
            mth.invoke(ClassA.class.newInstance(),new Integer(1), new Integer(2));
            Method mth1 = ClassA.class.getMethod("StringAdd",new Class[]{ String.class});
            mth1.invoke(ClassA.class.newInstance(),"--test");
        } catch(Exception e){
        }
    }
}
二、静态代理

猜你喜欢

转载自blog.csdn.net/ddhmbbklyk2018/article/details/82413823
03
今日推荐