Java基础笔记总结(19)-反射,枚举类 JDK1.7 1.8 新特性

反射

类的加载概述

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

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

连接

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

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

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

加载时机

创建类的实例

访问类的静态变量,或者为静态变量赋值

调用类的静态方法

使用反射方式来强制创建某个类或接口对应的java.lang.Class对象

初始化某个子类

直接使用java.exe来运行某个主类

--------------------------------------------------------------------------------------

类加载器分类:负责将.class文件加载到内存中,并为之生成对应的Class对象

类加载器分类:

Bootstrap ClassLoader 根类加载器 引导类加载器 java核心类的加载System String 在jdk下的jre中的rt.jar

Extension ClassLoader 扩展类加载器 负责jre扩展目录下的jar包的加载,在JDK中JRT的lib目录下的ext目录加载

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

------------------------------------------------------------------------------------

反射概述

JAVA反射机制就是在运行过程中,对任意一个类,都能知道这个类所有的属性和方法

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

这种动态获取信息以及动态调用对象方法的方式成为JAVA的反射机制

想要解刨一个类,必须要获取到该类的字节码文件对象

而解刨使用的就是Class类中的方法,所以要获取每一个字节码文件对应的Class文件

三种方式

Object类的getClass()方法,判断两个对象是否是同一个字节码文件

静态对象class,锁对象

Class类中的静态方法,读取配置文件

源文件阶段      字节码文件          创建配置文件

Person.java    Person.class        Person p = new Person();

Class clazz = class.forName("类名");

Class clazz = Person.class;

Class clazz = p.getClass();

读取配置文件,只改配置文件就可以获取不同的属性和方法

字节码文件 当作静态方法锁对象

判断是否是同一个字节码对象

------------------------------------------------------------------------------------

Class.forName()读取配置文件

榨汁机Juicer榨汁,分别有水果 苹果 香蕉 橘子 榨汁

package com.ysu.reflect;

import java.io.BufferedReader;

import java.io.FileNotFoundException;

import java.io.FileReader;

import java.io.IOException;

public class Reflect {

public static void main(String[] args) throws ClassNotFoundException, IOException, InstantiationException, IllegalAccessException {

//没用反射,只在使用动态

// Juicer juicer = new Juicer();

// juicer.run(new Apple());

// 用发射和配置文件

BufferedReader br = new BufferedReader(new FileReader("config.properties"));

Class clazz = Class.forName(br.readLine());

Fruit f = (Fruit) clazz.newInstance(); //父类引用指向子类对象

Juicer juicer = new Juicer();

juicer.run(f);

}

}

interface Fruit{

public void squeeze();

}

class Juicer {

public void run(Fruit f){

f.squeeze();

}

}

class Apple implements Fruit{

@Override

public void squeeze(){

System.out.println("榨出一杯苹果汁");

}

}

class Orange implements Fruit{

public void squeeze(){

System.out.println("榨出橘子酱");

}

}

------------------------------------------------------------------------------------

反射获取构造方法

Constructor

Class类的newInstance()方法是使用该类无参数的构造方法创建对象,一个类没有无参数构造函数,不能使用该方法,但是可以调用Class类的getConstructor()创建

获取有参构造创建对象

Class clazz = Class.forName("com.ysu.reflect.Person");

Constructor c= clazz.getConstructor(int.class,String.class);

Person p = (Person) c.newInstance(23,"张三");

System.out.println(p);

----------------------------------------------------------------------------------

通过反射获取成员变量

Class clazz = Class.forName("com.ysu.reflect.Person");

Method method = clazz.getMethod("eat");

Person p = (Person) clazz.newInstance();

method.invoke(p);

Method method2 = clazz.getMethod("eat", int.class);

method2.invoke(p, 10);

------------------------------------------------------------------------------------

通过反射越过泛型检查(泛型擦除)

ArrayList<Integer> 中添加一个字符串对象

ArrayList<Integer> list = new ArrayList<>();

list.add(11);

//泛型只在编译器有效,在运行期会被擦除掉

// list.add("abc");

Class clazz = Class.forName("java.util.ArrayList"); //获取字节码对象

Method m = clazz.getMethod("add", Object.class);//获取add方法

m.invoke(list, "abc");

System.out.println(list);

--------------------------------------------------------------------------------

修改通用属性方法

package com.ysu.reflect;

import java.lang.reflect.Field;

public class Tool {

public void setProperty(Object obj,String propertyName,Object value) throws Exception, Exception{

// 获取字节码对象

Class clazz = obj.getClass();

// 暴力反射获取字段

Field f = clazz.getDeclaredField(propertyName);

f.setAccessible(true);

f.set(obj, value);

}

}

-------------------------------------------------------------------------------------

1、xxx.properties获取属性类

2、利用反射获取相关属性,并运行方法

-------------------------------------------------------------------------------------反射的动态代理

package com.ysu.reflect;

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

public class MyInvocationHandler implements InvocationHandler {

private Object target;

public MyInvocationHandler(Object target) {

this.target = target;

}

@Override

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

System.out.println("1111");

// 執行被代理的Target

method.invoke(target, args);

System.out.println("2222");

return null;

}

}

-----------------------------------------------------------------------------------

package com.ysu.reflect;

import java.lang.reflect.Proxy;

public class Test4 {

public static void main(String[] args) {

UserImp ui = new UserImp();

//动态代理

// 本来自己要做的请别人做,被请的人就是代理对象

// 在程序运行过程中产生这个对象,而程序运行过程中产生的对象就是我们刚才反射讲解的内容,所以动态代理就是通过反射生成一个代理

// Proxy 和 InvocationHandler接口,通过类和接口可以生成动态代理对象

MyInvocationHandler m = new MyInvocationHandler(ui);

User u = (User) Proxy.newProxyInstance(ui.getClass().getClassLoader(), ui.getClass().getInterfaces(), m);

u.add();

u.delete();

}

}

-----------------------------------------------------------------------------------

末班模式

就是定义一个算法的骨架,将具体的算法延迟到子类实现,抽象类不希望被重写的方法用final修饰

如果有算法骨架需要被修改的话,有抽象类

------------------------------------------------------------------------------------

枚举抽象类

一共有三种方法

利用单例模式

class Week {

  public staitc  Week MON = new Week();

  private Week(){}

}

class abstract Week2{

  public staitc final Week MON = new Week(){

public void show(){

System.out.println();

}

    }

  private Week(){}

  public abstract void show();

}

--------------------------------------------------------------

第一种 创建Enum类,直接写入对象就可以实现

第二种 public enum Week2{

MON("")

private String name;

private Week2(String name){

this.name = name;

}

}

//可以写入get set方法

测试 Week mon = Week.MON ;

第三种是写入方法,用匿名实现子类方法

public enum Week3{

MON(""){

public void show(){

System.out.println("xxxxxxx");

}

};

private String name;

private Week2(String name){

this.name = name;

}

}

测试 Week mon = Week.MON ;

mon.show();

注意 枚举项要放在第一行,枚举类可以有抽象方法,但是枚举项必须重写该方法

-----------------------------------------------------------------------------

枚举类的常见方法

ordinal() 返回枚举常量的序数 (枚举项都是有编号的)

compareTo() 枚举项比较的是编号

name() 获取枚举项的名称

toString()  也是打印名称,

valueOf Week mon = Week.value(Week.class,"MON");

System.out.println(mon);通过字节码文件

-------------------------------------------------------------------------------

JDK7的新特性

二进制字面量

数字字面量出现下划线

switch 语句可以用字符串

泛型简化,菱形泛型

异常的多个catch合并,每个异常就用或|

try with resources语句(自动关闭流)

-----------------------------------------------------------------------------

JDK1.8 接口中可以书写具有方法体的方法。如果不是静态方法 必须要用default修饰

用default修饰的就要采用实现类调用该方法,而静态方法可以接口名直接调用

局部内部类:

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容