Java 基础技能

包括以下大致内容

  • Object类的常用方法
  • 常用反射方法
  • 常用字段处理
  • 枚举处理
  • 泛型的获取
  • 基本类型的判断

1. isAssignableFrom()与instanceof

  • isAssignableFrom()
    • 描述:判断目标类是否为父类的子类
    • 使用:父类.class.isAssignableFrom(子类.class)
  • instanceof
    • 描述:判断实例是否为父类的子类
    • 描述:(new)实例 instanceof 父类

具体的demo如下

package cn.linuxcrypt.api.demo;

import lombok.Data;
import org.junit.Test;

public class TestDemo {

    @Test
    public void test(){
        System.out.println("Parent.isAssignableFrom(Son): " + Parent.class.isAssignableFrom(Son.class));
        System.out.println("Son.isAssignableFrom(Parent): " + Son.class.isAssignableFrom(Parent.class));
        System.out.println("Son instanceof Parent: " + ((new Son()) instanceof Parent));
        System.out.println("Parent instanceof Son: " + ((new Parent()) instanceof Son));
    }
}

@Data
class Parent{
   private String name;
}

@Data
class Son extends Parent{
    private String name;
}

输出结果

Parent.isAssignableFrom(Son): true
Son.isAssignableFrom(Parent): false
Son instanceof Parent: true
Parent instanceof Son: false

2. Class.getField和getDeclaredField的区别

  • getField和getDeclaredField都是Class类的方法,反射成员变量时使用。(getMethod和getDeclaredMethod类似)

  • getField 获取一个类的 ==public成员变量,包括基类== 。

  • getDeclaredField 获取一个类的 ==所有成员变量,不包括基类== 。

    Field.setAccessible 成员变量为private,必须进行此操作。

3. 提高java反射速度的方法method.setAccessible(true)

AccessibleObject 类是 Field、Method 和 Constructor 对象的基类。它提供了将反射的对象标记为在使用时取消默认 Java 语言访问控制检查的能力。对于公共成员、默认(打包)访问成员、受保护成员和私有成员,在分别使用 Field、Method 或 Constructor 对象来设置或获得字段、调用方法,或者创建和初始化类的新实例的时候,会执行访问检查。 在反射对象中设置 accessible 标志允许具有足够特权的复杂应用程序(比如 Java Object Serialization 或其他持久性机制)以某种通常禁止使用的方式来操作对象。 setAccessible  public void setAccessible(boolean flag)                     throws SecurityException  将此对象的 accessible 标志设置为指示的布尔值。值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。值为 false 则指示反射的对象应该实施 Java 语言访问检查。 实际上setAccessible是启用和禁用访问安全检查的开关,并不是为true就能访问为false就不能访问,一般情况下,我们并不能对类的私有字段进行操作,利用反射也不例外,但有的时候,例如要序列化的时候,我们又必须有能力去处理这些字段,这时候,我们就需要调用AccessibleObject上的setAccessible()方法来允许这种访问,而由于反射类中的Field,Method和Constructor继承自AccessibleObject,因此,通过在这些类上调用setAccessible()方法,我们可以实现对这些字段的操作。但有的时候这将会成为一个安全隐患,为此,我们可以启用java.security.manager来判断程序是否具有调用setAccessible()的权限。默认情况下,内核API和扩展目录的代码具有该权限,而类路径或通过URLClassLoader加载的应用程序不拥有此权限。例如:当我们以这种方式来执行上述程序时将会抛出异常

  • 提高java反射速度的方法method.setAccessible(true)
  • Filed.setAccessible(true), 大多时候允许访问私有变量

参考