注解与反射:得到Class类的几种方式

Class类

对象照镜子后可以得到的信息:某个类的属性,方法和构造器,某个类到底实现了哪些接口。对于每个类而言,JRE都为其保留一个不变的Class类型的对象。一个Class对象包含了特定某个结构(class/interface/enum/annotation/primitive type/void)的有关信息。

Class本身也是一个类

Class对象只能由系统建立对象

一个加载的类在JVM中只会有一个Class实例

一个Class对象对应的是一个加载到JVM中的一个.class文件

每个类的实例都会记得自己是由哪个Class实例所生成

通过Class可以完整的得到一个类中的所有被加载的结构

Class类是Reflection的根源,针对任何你想动态加载,运行的类,唯有先获得相应的Class对象

Class类的常用方法

方法名功能说明

static ClassforName(String name)

返回指定类名name的Class对象

Object newInstance()调用缺省构造函数,返回Class对象的一个实例
getName()返回此Class对象所表示的实体(类,接口,数组类或void)的名称
Class getSuperClass()返回当前Class对象的父类的Class对象
Class[ ]  getinterfaces()获取当前Class对象的接口
ClassLoader getClassLoader()返回该类的类加载器
Constructor[ ] getConstructors()返回一个包含某些Construction对象的数组
Method getMethod(String name,Class...)返回一个Method对象,此对象的形参类型为paramType
Filed[ ] getDeclaredFields()返回Field对象的一个数组

获取Class类的实例

a)若已知具体的类,通过类的class属性获取,该方法最为安全可靠,程序性能最高

                        Class clazz = Person.class;

 b)已知某个类的实例,调用该实例的getClass()方法获取Class对象

                        Class clazz = person.getClass();

c)已知一个类的全类名,且该类在类路径下,可通过Class类的静态方法forName()获取,可能抛出ClassNotFoundException

                Class clazz = Class.forName("demo01.Student"); 

d)内置基本数据类型可以直接用类名.Type

e)还可以利用ClassLoader 

代码实现

package com.reflection;
//测试class类的创建方式有哪些
public class Test03 {
    public static void main(String[] args) throws ClassNotFoundException {
        Person person = new Student();
        System.out.println("这个人是"+person.name); //这个人是学生
        //方式一:通过对象获得
        Class c1 = person.getClass();
        System.out.println(c1.hashCode());  //951007336
        //方式二:forName获得
        Class c2 = Class.forName("com.reflection.Student");
        System.out.println(c2.hashCode()); //951007336
        //方式三:通过类名.class获得
        Class c3 = Student.class;
        System.out.println(c3.hashCode());  //951007336
        //三个不同方式创建的class,返回的对象都是同一个

        //(特殊的)方式四:基本内置类型的包装类都有一个Type属性
        Class c4 = Integer.TYPE;  
        //前面三个class对象都是Student这个类的,这个是TYPE类型的,不一样
        System.out.println(c4);  //int

        //获得父类类型
        Class c5 = c1.getSuperclass();
        System.out.println(c5);  //class com.reflection.Person
    }
}
class Person{
    public String name;

    public Person() {
    }

    public Person(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                '}';
    }
}
class Student extends Person{
    public Student(){
        this.name = "学生";
    }
}
class Teacher extends Person{
    public Teacher(){
        this.name = "老师";
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kong清空

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值