java反射机制实战(1) - Class

当一个类在java语法下无法调用的情况下,例如其他类访问某一个类私有变量,可以使用反射机制破坏这种规则。接下来就开始实战: 

package com.pss.model;

/**
 * 被反射的类
 */
public class ReflectionModel {
    private String sql;
    private Integer count;

    public ReflectionModel() {
        super();
        System.out.println("调用构造方法1");
    }

    public ReflectionModel(String sql) {
        this.sql = sql;
        System.out.println("调用构造方法2");
    }

    public ReflectionModel(String sql, Integer count) {
        this.sql = sql;
        this.count = count;
        System.out.println("调用构造方法3");
    }

    private ReflectionModel(String sql, Integer count, boolean flag) {
        this.sql = sql;
        this.count = count;
        System.out.println("调用构造方法4");
    }

    public String getSql() {
        return sql;
    }

    private void setSql(String sql) {
        this.sql = sql;
    }

    public Integer getCount() {
        return count;
    }

    private void setCount(Integer count) {
        this.count = count;
    }

    @Override
    public String toString() {
        return "ReflectionModel{" +
                "sql='" + sql + '\'' +
                ", count=" + count +
                '}';
    }
}

获取Class三种方式

/**
 * 三种获取Class方法
 */
public class ReflectionTest {
    public static void main(String[] args) throws ClassNotFoundException {
        // 方式一,通过类名.class获取
        Class<? extends ReflectionModel> clazz1 = ReflectionModel.class;

        // 方式二,通过对象方法获取
        Class<? extends ReflectionModel> clazz2 = new ReflectionModel().getClass();

        // 方式三,通过Class.forName("包名")获取
        Class<? extends ReflectionModel> clazz3 = (Class<? extends ReflectionModel>) Class.forName("com.pss.model.ReflectionModel");

        System.out.println(clazz1);
        System.out.println(clazz2);
        System.out.println(clazz3);

        System.out.println(clazz1.equals(clazz2));
        System.out.println(clazz1 == clazz3);
    }
}
打印结果:
class com.pss.model.ReflectionModel
class com.pss.model.ReflectionModel
class com.pss.model.ReflectionModel
true
true
 

由此可知class的引用指向的是同一个对象

 

1、通过class获取是否是某一种类型。

// 是否注解类型
System.out.println(reflectionClassesModelClass.isAnnotation());

// 是否包含MyAnnotation注解
System.out.println(reflectionClassesModelClass.isAnnotationPresent(MyAnnotation.class));

// 是否匿名类
Runnable runnable = new Runnable() {
    @Override
    public void run() {
    }
};
System.out.println(runnable.getClass().isAnonymousClass());

// 是否数组
System.out.println(reflectionClassesModelClass.isArray());

// 是否枚举
System.out.println(reflectionClassesModelClass.isEnum());

// 是否该类实例
System.out.println(reflectionClassesModelClass.isInstance(new ReflectionClassesModel()));

// 是否接口
System.out.println(reflectionClassesModelClass.isInterface());

// 是否内部类
System.out.println(ReflectionClassesModel.B.class.isMemberClass());

// 是否局部类
class LocalClass{
}
System.out.println(LocalClass.class.isLocalClass());
打印结果:
false
false
true
false
false
false
false
true
true

 

2、通过class 获取内部类

Class<ReflectionClassesModel> reflectionClassesModelClass = ReflectionClassesModel.class;

// 获取pub内部类
Class<?>[] classes = reflectionClassesModelClass.getClasses();
for (Class<?> c : classes) {
    System.out.println(c.getName());
}

System.out.println("============================");

// 获取全部内部类
Class<?>[] declaredClasses = reflectionClassesModelClass.getDeclaredClasses();
for (Class<?> c : declaredClasses) {
    System.out.println(c.getName());
}
打印结果:
com.pss.model.ReflectionClassesModel$C
com.pss.model.ReflectionClassesModel$B
com.pss.model.AbstractReflectionClassesModel$C
com.pss.model.AbstractReflectionClassesModel$B
============================
com.pss.model.ReflectionClassesModel$E
com.pss.model.ReflectionClassesModel$D
com.pss.model.ReflectionClassesModel$C
com.pss.model.ReflectionClassesModel$B
com.pss.model.ReflectionClassesModel$A

 

3、获取class的父类

Class<? super ReflectionClassesModel> superclass = reflectionClassesModelClass.getSuperclass();
System.out.println(superclass.getName());
打印结果:
com.pss.model.AbstractReflectionClassesModel

 

4、获取class的接口,任意实现2个接口

 // 获取类全部接口
 Class<?>[] interfaces = reflectionClassesModelClass.getInterfaces();
 for (Class clazz : interfaces) {
     System.out.println(clazz.getName());
 }
打印结果:
java.io.Serializable
java.lang.Cloneable

5、获取class的包名

Package aPackage = reflectionClassesModelClass.getPackage();        System.out.println(aPackage.getName());
打印结果:
com.pss.model

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值