首页 > 编程语言 >Java拾贝第十七天——反射之初认Class类

Java拾贝第十七天——反射之初认Class类

时间:2023-11-05 18:22:04浏览次数:36  
标签:Noodle Java 拾贝 class moudle2 Class 初认 public Test17

反射

反射可以在运行中知晓任意类的任意属性和方法。这种动态获取信息的功能称之为反射

小栗子

package moudle2;

public class Test17 {
    public static void main(String[] args) {
        Test17 t17 = new Test17();
        System.out.println(t17.getClass());
    }
}

程序运行结果:

class moudle2.Test17

上述栗子中,Test17类使用了继承自Object类的getClass()方法。

打印结果是Test17类的完整的 "包.类" 名。(也叫完整名称)

getClass()方法定义如下:

public final native Class<?> getClass()

final:无法被子类重写的方法。
native:调用底层类库,底层使用其他语言实现。
返回类型:Class,一个名为Class的类。
泛型:通配符,接收任意类型。

认识Class类

getClass()方法返回的是一个Class类,Class类是Java反射的源头。

Class类表示一个类自身,通过Class类可以完整地获得一个类的完整结构,包括:方法,属性,完整名称,甚至包括其父类和实现的接口。

三种实例化Class类对象的方法

栗子:

package moudle2;

public class Test17 {
    public static void main(String[] args) throws ClassNotFoundException {
        Test17 t17 = new Test17();

        System.out.println(Class.forName("moudle2.Test17"));//Class类的静态方法,传参为完整类名
        System.out.println(t17.getClass());//继承自Object的getClass()方法
        System.out.println(Test17.class);//一种特殊的实例化 类.class
    }
}

程序运行结果:

class moudle2.Test17
class moudle2.Test17
class moudle2.Test17

上述三种方法都是一样的,但第一种Class.forName()的方式较为常见且更具灵活性。

但可能会出现ClassNotFoundException异常

Class类的使用

Clss类的部分常用方法:

方法 类型 描述
public static Class<?> forName(String className) throws ClassNotFoundException 静态方法 传入完整类名返回实例化Class对象
public String getName() 普通方法 获取一个类的完整名称
public T newInstance() throws InstantiationException, IllegalAccessException 普通方法 返回Class定义的类实例化对象
public Class<?>[] getInterfaces() 普通方法 获取一个类实现的全部接口
public native Class<? super T> getSuperclass() 底层方法 获取一个类的父类

public String getName()

获取一个类的完整名称

栗子:

package moudle2;

public class Test17 {
    public static void main(String[] args) throws ClassNotFoundException {
        Test17 t17 = new Test17();
        System.out.println(Class.forName("moudle2.Test17").getName());
    }
}

程序运行结果:

moudle2.Test17

public T newInstance()

创建并返回一个类的实例化对象

栗子:

package moudle2;

public class Test17 {
    public static void main(String[] args) {
        try {
            Class clazz = Class.forName("moudle2.Noodle");//完整名称
            Noodle o = (Noodle) clazz.newInstance();//创建Noodle类的实例 等价于 Noodle o =new Noodle();
            o.eat();//向下转型是为了调用Noodle类的特有方法 eat
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class Noodle {
    private String name = "面条";

    public Noodle() {
    }
    public void eat() {
        System.out.println("吃" + name);
    }
}

程序运行结果:

吃面条

注意被实例化的类必须存在无参构造。(隐式显式都可以,但必须存在无参构造)

不存在无参构造的栗子如下:

package moudle2;

public class Test17 {
    public static void main(String[] args) {
        try {
            Class clazz = Class.forName("moudle2.Noodle");
            Noodle o = (Noodle) clazz.newInstance();//创建Noodle类的实例 等价于 Noodle o =new Noodle();
            o.eat();//向下转型是为了调用Noodle类的特有方法 eat

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class Noodle {
    private String name = "面条";

    public Noodle(String name) {//显式定义了有参构造,默认的隐式无参构造被覆盖
        this.name = name;
    }
    public void eat() {
        System.out.println("吃" + name);
    }
}

程序运行结果:

java.lang.InstantiationException: moudle2.Noodle
	at java.lang.Class.newInstance(Class.java:427)
	at moudle2.Test17.main(Test17.java:7)
Caused by: java.lang.NoSuchMethodException: moudle2.Noodle.<init>()
	at java.lang.Class.getConstructor0(Class.java:3082)
	at java.lang.Class.newInstance(Class.java:412)
	... 1 more

因此,建议每个自定义的类必须显式定义无参构造

public Class<?>[] getInterfaces()

获取一个类实现的所有接口

栗子:

package moudle2;

public class Test17 {
    public static void main(String[] args) {
        try {
            Class clazz = Class.forName("moudle2.Noodle");

            Class[] interfaces = clazz.getInterfaces();
            for (Class a : interfaces) {
                System.out.println(a);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class Noodle implements Hot,Delicious,Cheap {}

interface Hot{}
interface Delicious{}
interface Cheap{}

程序运行结果:

interface moudle2.Hot
interface moudle2.Delicious
interface moudle2.Cheap

public native Class<? super T> getSuperclass()

获取一个类的父类

栗子:

package moudle2;

public class Test17 {
    public static void main(String[] args) {
        try {
            Class clazz = Class.forName("moudle2.Noodle");

            Class a = clazz.getSuperclass();
            System.out.println(a);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class Noodle extends Rice {}

class Rice {}

程序运行结果:

class moudle2.Rice

标签:Noodle,Java,拾贝,class,moudle2,Class,初认,public,Test17
From: https://www.cnblogs.com/Ocraft/p/17810856.html

相关文章

  • Java+Jsp+MySQL高校选课系统设计与实现(附源码下载地址)
    @目录01源码下载02系统概述03开发工具及技术选型04运行环境05用户分析06功能分析07数据库设计08项目工程结构及说明09部分功能展示及源码9.1管理员端--首页9.2管理员端--专业管理9.3管理员--课程管理9.4管理员端--统计信息9.5普通用户端--基本信息9.6普通用户端--......
  • Java根据文本内容,批量修改文件名称
    这两天学到IO流对文件的操作,想起在几年前有几百个按"1,2,3"排序命名的短文,于是产生将其批量命名后整理的想法.这批文本的名称在文件内第十行的位置,前面的是广告和其他不相关的东西本想构造抓到第九行广告语后返回下一行文本的方法,没能实现,只好用了更简单直接的直接抓第十行......
  • 前端学习-JavaScrip学习-js基础02
    学习教程:黑马程序员视频链接运算符自增运算符leti=1;console.log(i+++1);//输出2,i=2leti=1;console.log(++i+1);//输出3,i=2比较运算符开发中,判断相等,推荐用===比较小数会有精度问题逻辑运算符优先级:非>与>或练习01<!DOCTYPEhtml><htmllang="en"><he......
  • java进程后台运行
    实现Java进程后台运行的步骤流程图如下所示:创建Java程序编译Java程序将class文件打成jar包编写运行脚本后台运行脚本步骤一:创建Java程序首先,你需要创建一个Java程序,可以使用任何你熟悉的Java开发工具。假设你的Java程序是一个简单的HelloWorld程序,如下所示:publicclassHelloWorld......
  • java后置运行bat
    后置@echooffcdD:\server\gp12\alarmJavad:start/Bjavaw-jar-Xms128m-Xmx1024mpigx-gp12-biz.jar前置cdD:\server\gp12\alarmJavajava-jar-Xms128m-Xmx1024mpigx-gp12-biz.jar......
  • 论Java目前的发展道路
    Java自推出以来就一直是一种非常流行的编程语言,它被广泛应用于企业级应用、网站、移动应用等各个方面。以下是关于Java发展的一些相关信息:在技术领域,Java仍然是一个热门话题,因为它拥有大量的开源项目,并且有着稳定的社区支持。它的最新版本提供了许多新功能和改进,使它变得更加高效和......
  • java集合
    一、前言二、集合简介1.定义:2.集合与数组的区别:3.集合的好处:三、集合框架1.单列集合2.双列集合Δ体系图(重要)四、List集合详解(三万余字)五、Set集合详解(三万余字)六、增强for和迭代器万字详解七、Map集合详解(三万余字)八、Collections类详解九、泛型......
  • JavaScript内存管理——隐藏类
    根据JavaScript所在的运行环境,有时候需要根据JavaScript引擎采取不同的性能优化策略。如果代码非常注重性能,那么隐藏类对我们是非常重要的。比如以下的代码:functionUser(){this.name="UserName";}letuser1=newUser();leruser2=newUser();在上面的代码中......
  • 每天5道Java面试题(第三天)
    1. final在Java中有什么作用?final修饰的类不能被继承。final修饰的方法不能被重写。final修饰的变量叫常量,常量必须初始化,初始化之后值就不能被修改。2. Java中的Math.round(-1.5)等于多少?等于-1: Math.round四舍五入大于0.5向上取整的(返回最接近它的整数,若有两个......
  • java——kafka随笔——broker&主题-topic&分区-partition理解
                  首先,让我们来看一下基础的消息(Message)相关术语:名称解释Broker消息中间件处理节点,⼀个Kafka节点就是⼀个broker,⼀个或者多个Broker可以组成⼀个Kafka集群TopicKafka根据topic对消息进⾏归类,发布到Kafka集群的每条消息都......