java反省的简单介绍

博主:adminadmin 2022-11-27 06:52:06 47

本篇文章给大家谈谈java反省,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

java的反射机制吗

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

JAVA反射(放射)机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。

Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。

有时候我们说某个语言具有很强的动态性,有时候我们会区分动态和静态的不同技术与作法。我们朗朗上口动态绑定(dynamic binding)、动态链接(dynamic linking)、动态加载(dynamic loading)等。然而“动态”一词其实没有绝对而普遍适用的严格定义,有时候甚至像面向对象当初被导入编程领域一样,一人一把号,各吹各的调。

一般而言,开发者社群说到动态语言,大致认同的一个定义是:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。

尽管在这样的定义与分类下Java不是动态语言,它却有着一个非常突出的动态相关机制:Reflection。这个字的意思是“反射、映象、倒影”,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。这种“看透class”的能力(the ability of the program to examine itself)被称为introspection(内省、内观、反省)。Reflection和introspection是常被并提的两个术语。

Java如何能够做出上述的动态特性呢?这是一个深远话题,本文对此只简单介绍一些概念。整个篇幅最主要还是介绍Reflection APIs,也就是让读者知道如何探索class的结构、如何对某个“运行时才获知名称的class”生成一份实体、为其fields设值、调用其methods。本文将谈到java.lang.Class,以及java.lang.reflect中的Method、Field、Constructor等等classes。

java开发的缺点

我认为Java语言的10大问题是:

1、缺少闭包(closure):我想这个不需要解释了。函数式编程已经存在几十年了,但最近几年,它们获得了越来越多的关注,最主要的原因,是它可以自然地编写并行程序。我部分的同意Joshua Bloch强调在Java中引入闭包的问题需要再想一想(BGGA提议的方式真的很糟),至少闭包的缺失,使得在Java中做任何真正的函数式编程都是不可能的。

2、缺少一等函数:这个问题与前一个有些关联,但我认为它更糟糕。在Java里,要达到类似效果的唯一方式,是使用著名的、丑陋悲惨的单方法匿名内部类,但这看上去的确是一个拙劣的方法。甚至在C#中,也通过代理机制,提供了一个更好的实现。

3、原生类型(Primitive types):如果在Java中一切皆对象,那是多么完美啊,但他们偏偏不这样设计。因而,这一点导致了一些问题,比如,不能把一个int放到集合(Collection)里,这个在Java5中通过自动装箱特性得到了解决(下面会提到)。它也造成了传值与传引用上的困扰,原生类型数据是通过值传给方法的(复制一份拷贝,然后传给函数),而真正的对象是通过传递(译注:其实是复制对象地址再传递,因此应该也是传值方式,只是由于函数内部可通过这个对象地址访问对象,因此效果上类似传引用)。

4、自动装箱(Autoboxing)和自动拆箱(autounboxing):这个特性是为了解决因原生类型的存在所导致的问题,在Java5引入的。它允许静默地转换原生类型到相应的对象,但这常常导致其它的问题。比如Integer可以为null,但int不能,因此这时JVM只能抛出一个难以调试的空指针异常(NullPointerException)。此外,它还可能导致其它奇怪的行为,就像下面的例子,我们就很难理解,变量test为什么是false:

Intger a = new Integer(1024);

Intger b = new Integer(1024);

boolean test = a b || a == b || a b;

5、缺少范型具类化:范型是Java5引入的一个很酷的特征,但是为了保持与旧版本Java的兼容性,导致缺失某些重要的特性,尤其是不能在运行时反省范型的类型。例如,你有一个方法,接受List参数,如果传进来一个List,你却不能知道运行里该范型的确切类型。同理,你也不能创建范型数组。这意味着,尽管下面的代码看起来很自然,但却不编译不了:

List[] listsOfStrings = new List[3];

6、不可避免的范型警告:你有发现过自己陷入不可能去掉的关于范型的警告么?如果你像我一样大量使用范型,我打赌你碰到过。事实上,是这个问题的规模化症状,让他们认为需要引入一个特定的注解(@SuppressWarnings("unchecked"))来处理这种情况,我觉得,范型应该可能被设计的更好。

7、不能传void给方法调用:我得承认,这种给方法传递void的需求,乍一看有些怪异。我喜欢DSL,当我实现自己的DSL库(lambdaj)的一个特定特性时,我不得不需要一个方法声明成这样的签名:void doSomething(Object parameter),这里为这个方法传进来的参数parameter,是另一个方法调用的结果,它唯一的目的,是注册调用(的对象)自身,以可以在以后执行它。让我吃惊的是,即使println方法返回void,看上去也并没有一个好理由,不允许我把代码写成这样,:

doSomething(System.out.println("test"));

8、没有原生的代理机制:代理是一种非常有效和应用广泛的模式,但Java提供的代理机制,只针对接口,而不是具体类。这是为什么象cblib这样提供这种机制的库,被如此多的主流框架,如Spring和Hibernate,采用的原因。此外,由于cglib通过运行时创建被代理类的子类来实现的,因此这些种方式有一个众所周知的限制——不能代理final类,比如String。

9、差劲的Switch...case语句:Java规定,switch...case只能选择int和enum(Java5开始)。这一点如果跟更现代的语言如Scala相比,看起来简直太弱了。

10、受检查异常(Checked exception):类似原生类型,受检查异常也已经成为Java的一个罪孽之源。它迫使程序员必须做下面两件极其糟糕讨厌的事情中的一个:让你的代码里充斥大量的、糟糕难读的、容易出错的try...catch语句,而这样做的最大意义,只是将捕获的异常,包装成运行时异常,然后再重新抛出;或者是让大量的抛出声明子句污染你的API,让接口缺少灵活性和可扩展性。

真正的问题是,这里我提到的这几大主要问题,唯一的解决办法,是要做一个痛苦的决择,定义一套新的语言规范,放下当前版本的向后兼容性。我猜他们永远也不会这么做,虽然我相信,如果编写一个能够自动转换旧Java源码的程序,让它们与假设的新版本兼容,并不是很困难。最后,这就是我决定开始寻找一个更好的JVM兼容语言的原因。

java中的反射可以做什么

Java反射机制主要提供了以下功能:

在运行时判断任意一个对象所属的类;

在运行时构造任意一个类的对象;

在运行时判断任意一个类所具有的成员变量和方法;

在运行时调用任意一个对象的方法;生成动态代理。

JAVA有着一个非常突出的动态相关机制:Reflection。

这个字的意思是“反射、映象、倒影”,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。这种“看透class”的能力(the ability of the program to examine itself)被称为introspection(内省、内观、反省)。Reflection和introspection是常被并提的两个术语。

Java的反射到底有什么用途?

反射的作用可谓是博大精深,

JDK动态代理生成代理类的字节码后,首先把这个类通过defineclass定义成一个类,然后用class.for(name)会把该类加载到jvm,之后我们就可以通过,A.class.GetMethod()获取其方法,然后通过invoke调用其方法,在调用这个方法时,实际上会通过被代理类的引用再去调用原方法。

Java反射包reflection提供对Class,Method,field,constructor1 等信息的封装类型

通过这些api可以轻易获得一个类的各种信息并且可以进行实例化,方法调用等。

类中的private参数可以通过setaccessible方法强制获取。

java中的反射机制是什么?有什么作用呢?求解,谢谢。

Java反射机制详解

1. 反射机制是什么

反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

2. 反射机制能做什么

反射机制主要提供了以下功能:

在运行时判断任意一个对象所属的类;

在运行时构造任意一个类的对象;

在运行时判断任意一个类所具有的成员变量和方法;

在运行时调用任意一个对象的方法;

生成动态代理。

3. 反射机制的相关API

通过一个对象获得完整的包名和类名

package net.xsoftlab.baike;

public class TestReflect {

    public static void main(String[] args) throws Exception {

        TestReflect testReflect = new TestReflect();

        System.out.println(testReflect.getClass().getName());

        // 结果 net.xsoftlab.baike.TestReflect

    }

}

实例化Class类对象

package net.xsoftlab.baike;

public class TestReflect {

    public static void main(String[] args) throws Exception {

        Class? class1 = null;

        Class? class2 = null;

        Class? class3 = null;

        // 一般采用这种形式

        class1 = Class.forName("net.xsoftlab.baike.TestReflect");

        class2 = new TestReflect().getClass();

        class3 = TestReflect.class;

        System.out.println("类名称   " + class1.getName());

        System.out.println("类名称   " + class2.getName());

        System.out.println("类名称   " + class3.getName());

    }

}

获取一个对象的父类与实现的接口

package net.xsoftlab.baike;

import java.io.Serializable;

public class TestReflect implements Serializable {

    private static final long serialVersionUID = -2862585049955236662L;

    public static void main(String[] args) throws Exception {

        Class? clazz = Class.forName("net.xsoftlab.baike.TestReflect");

        // 取得父类

        Class? parentClass = clazz.getSuperclass();

        System.out.println("clazz的父类为:" + parentClass.getName());

        // clazz的父类为: java.lang.Object

        // 获取所有的接口

        Class? intes[] = clazz.getInterfaces();

        System.out.println("clazz实现的接口有:");

        for (int i = 0; i  intes.length; i++) {

            System.out.println((i + 1) + ":" + intes[i].getName());

        }

        // clazz实现的接口有:

        // 1:java.io.Serializable

    }

}

获取某个类中的全部构造函数 - 详见下例

通过反射机制实例化一个类的对象

package net.xsoftlab.baike;

import java.lang.reflect.Constructor;

public class TestReflect {

    public static void main(String[] args) throws Exception {

        Class? class1 = null;

        class1 = Class.forName("net.xsoftlab.baike.User");

        // 第一种方法,实例化默认构造方法,调用set赋值

        User user = (User) class1.newInstance();

        user.setAge(20);

        user.setName("Rollen");

        System.out.println(user);

        // 结果 User [age=20, name=Rollen]

        // 第二种方法 取得全部的构造函数 使用构造函数赋值

        Constructor? cons[] = class1.getConstructors();

        // 查看每个构造方法需要的参数

        for (int i = 0; i  cons.length; i++) {

            Class? clazzs[] = cons[i].getParameterTypes();

            System.out.print("cons[" + i + "] (");

            for (int j = 0; j  clazzs.length; j++) {

                if (j == clazzs.length - 1)

                    System.out.print(clazzs[j].getName());

                else

                    System.out.print(clazzs[j].getName() + ",");

            }

            System.out.println(")");

        }

        // 结果

        // cons[0] (java.lang.String)

        // cons[1] (int,java.lang.String)

        // cons[2] ()

        user = (User) cons[0].newInstance("Rollen");

        System.out.println(user);

        // 结果 User [age=0, name=Rollen]

        user = (User) cons[1].newInstance(20, "Rollen");

        System.out.println(user);

        // 结果 User [age=20, name=Rollen]

    }

}

class User {

    private int age;

    private String name;

    public User() {

        super();

    }

    public User(String name) {

        super();

        this.name = name;

    }

    public User(int age, String name) {

        super();

        this.age = age;

        this.name = name;

    }

    public int getAge() {

        return age;

    }

    public void setAge(int age) {

        this.age = age;

    }

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

    @Override

    public String toString() {

        return "User [age=" + age + ", name=" + name + "]";

    }

}

获取某个类的全部属性

package net.xsoftlab.baike;

import java.io.Serializable;

import java.lang.reflect.Field;

import java.lang.reflect.Modifier;

public class TestReflect implements Serializable {

    private static final long serialVersionUID = -2862585049955236662L;

    public static void main(String[] args) throws Exception {

        Class? clazz = Class.forName("net.xsoftlab.baike.TestReflect");

        System.out.println("===============本类属性===============");

        // 取得本类的全部属性

        Field[] field = clazz.getDeclaredFields();

        for (int i = 0; i  field.length; i++) {

            // 权限修饰符

            int mo = field[i].getModifiers();

            String priv = Modifier.toString(mo);

            // 属性类型

            Class? type = field[i].getType();

            System.out.println(priv + " " + type.getName() + " " + field[i].getName() + ";");

        }

         

        System.out.println("==========实现的接口或者父类的属性==========");

        // 取得实现的接口或者父类的属性

        Field[] filed1 = clazz.getFields();

        for (int j = 0; j  filed1.length; j++) {

            // 权限修饰符

            int mo = filed1[j].getModifiers();

            String priv = Modifier.toString(mo);

            // 属性类型

            Class? type = filed1[j].getType();

            System.out.println(priv + " " + type.getName() + " " + filed1[j].getName() + ";");

        }

    }

}

通过反射机制调用某个类的方法

package net.xsoftlab.baike;

import java.lang.reflect.Method;

public class TestReflect {

    public static void main(String[] args) throws Exception {

        Class? clazz = Class.forName("net.xsoftlab.baike.TestReflect");

        // 调用TestReflect类中的reflect1方法

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

        method.invoke(clazz.newInstance());

        // Java 反射机制 - 调用某个类的方法1.

        // 调用TestReflect的reflect2方法

        method = clazz.getMethod("reflect2", int.class, String.class);

        method.invoke(clazz.newInstance(), 20, "张三");

        // Java 反射机制 - 调用某个类的方法2.

        // age - 20. name - 张三

    }

    public void reflect1() {

        System.out.println("Java 反射机制 - 调用某个类的方法1.");

    }

    public void reflect2(int age, String name) {

        System.out.println("Java 反射机制 - 调用某个类的方法2.");

        System.out.println("age - " + age + ". name - " + name);

    }

}

通过反射机制操作某个类的属性

package net.xsoftlab.baike;

import java.lang.reflect.Field;

public class TestReflect {

    private String proprety = null;

    public static void main(String[] args) throws Exception {

        Class? clazz = Class.forName("net.xsoftlab.baike.TestReflect");

        Object obj = clazz.newInstance();

        // 可以直接对 private 的属性赋值

        Field field = clazz.getDeclaredField("proprety");

        field.setAccessible(true);

        field.set(obj, "Java反射机制");

        System.out.println(field.get(obj));

    }

}

4. 反射机制的应用实例

在泛型为Integer的ArrayList中存放一个String类型的对象。

package net.xsoftlab.baike;

import java.lang.reflect.Method;

import java.util.ArrayList;

public class TestReflect {

    public static void main(String[] args) throws Exception {

        ArrayListInteger list = new ArrayListInteger();

        Method method = list.getClass().getMethod("add", Object.class);

        method.invoke(list, "Java反射机制实例。");

        System.out.println(list.get(0));

    }

}

通过反射取得并修改数组的信息

package net.xsoftlab.baike;

import java.lang.reflect.Array;

public class TestReflect {

    public static void main(String[] args) throws Exception {

        int[] temp = { 1, 2, 3, 4, 5 };

        Class? demo = temp.getClass().getComponentType();

        System.out.println("数组类型: " + demo.getName());

        System.out.println("数组长度  " + Array.getLength(temp));

        System.out.println("数组的第一个元素: " + Array.get(temp, 0));

        Array.set(temp, 0, 100);

        System.out.println("修改之后数组第一个元素为: " + Array.get(temp, 0));

    }

}

将反射机制应用于工厂模式

package net.xsoftlab.baike;

interface fruit {

    public abstract void eat();

}

class Apple implements fruit {

    public void eat() {

        System.out.println("Apple");

    }

}

class Orange implements fruit {

    public void eat() {

        System.out.println("Orange");

    }

}

class Factory {

    public static fruit getInstance(String ClassName) {

        fruit f = null;

        try {

            f = (fruit) Class.forName(ClassName).newInstance();

        } catch (Exception e) {

            e.printStackTrace();

        }

        return f;

    }

}

/**

 * 对于普通的工厂模式当我们在添加一个子类的时候,就需要对应的修改工厂类。 当我们添加很多的子类的时候,会很麻烦。

 * Java 工厂模式可以参考

 * 

 * 

 * 现在我们利用反射机制实现工厂模式,可以在不修改工厂类的情况下添加任意多个子类。

 * 

 * 但是有一点仍然很麻烦,就是需要知道完整的包名和类名,这里可以使用properties配置文件来完成。

 * 

 * java 读取 properties 配置文件 的方法可以参考

 * 

 * 

 * @author xsoftlab.net

 */

public class TestReflect {

    public static void main(String[] args) throws Exception {

        fruit f = Factory.getInstance("net.xsoftlab.baike.Apple");

        if (f != null) {

            f.eat();

        }

    }

}

我有一个微信公众号,经常会分享一些Java技术相关的干货,还有一些学习资源。

如果你喜欢我的分享,可以用微信搜索“Java团长”或者“javatuanzhang”关注。

java中的反射机制是什么,有什么作用啊?

Method类中的方法的使用(含代码和注释):

getMethods()获得本类及父类中的public权限修饰**符方法

getDeclaredMethods()专门获得调用该方法的对象的本类中的所有方法包括private权限修饰符**的方法

getDeclaredMethod(String name,class?...parameterTypes)

第一个参数:方法的名称

第二个参数:可变长度,写你要查找的那个方法的参数类型列表.class

getParameterCount()得到方法的参数个数123456

package LessonForReflection03;import java.lang.reflect.Method;import java.lang.reflect.Modifier;abstract class Card{

private void creatRandomNumbers(int count)//private关键字

{

}

public void getFullCardsNumbers(String[] random, String pre_numbers)

{

}

public static void getUserInfor()

{

}

public abstract void getUserInfor(String tel);

public abstract void getUserInfor(int sal1, int sal2) throws ArrayIndexOutOfBoundsException,ArithmeticException;}public class MethodInforGetter {

public static void main(String[] args) 

{

Class? c1 = Card.class;

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

Method[] m1 = c1.getMethods();//getMethods()获得本类及父类中的public方法!

for (Method m:m1)

{

System.out.println(m);

}

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

Method[] m2 = c1.getDeclaredMethods();//getDeclaredMethods()专门获得本类中的所有方法包括private!

for (Method m:m2)

{

System.out.println(m);

}

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

/*

*getDeclaredMethod(String name,class?...parameterTypes)

*第一个参数:方法的名称

*第二个参数:可变长度,写你要查找的那个方法的参数类型列表

*

* getParameterCount()得到方法的参数个数

*/

try 

{

Method m3 = c1.getDeclaredMethod("getUserInfor");

System.out.println(m3);

//getParameterCount()方法,获得方法参数个数

System.out.println(m3.getParameterCount());

System.out.println(Modifier.toString(m3.getModifiers()));//获得方法修饰符

System.out.println(m3.getReturnType());

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

Method m4 = c1.getDeclaredMethod("getUserInfor", int.class,int.class);

//getExceptionTypes()可以获得初始化当前Method对象的给Class对象初始化的那个类的那个指定方法抛出的异常类型

Class?[] exception = m4.getExceptionTypes();

for (Class? e:exception)

{

System.out.println(e);

}

} catch (NoSuchMethodException | SecurityException e) 

{

e.printStackTrace();

}

}}12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788

Constructor类中的方法的使用(含代码和注释):

java.lang.reflect.Constructor:

Constructor[] getConstructor()获得本类里的public权限修饰符构造函数,不能获取父类的!

Constructor[] getDeclaredConstructor()获得本类中的所以构造函数!

ConstructorT getConstructor(Class...parameterType)用参数决定获得本类中的某个的构造方法,只能获得public的

ConstructorT getDeclaredConstructor(Class...parameterType)用参数决定获得本类中的某个构造方法

附:

JDK8.0之后新增的类:

Executable:

它是Method和Constructor的父类

常用方法:

getParameter()获得类中方法参数

getExceptionTypes()获得类中某个方法抛出异常类型

getMoidfiers()获得方法权限修饰符

Parameter:

封装并代表了参数实例123456789101112131415

package LessonForReflection03;import java.lang.reflect.Constructor;import java.lang.reflect.Modifier;import java.lang.reflect.Parameter;/*

* java.lang.reflect.Constructor

*

* Constructor[] getConstructor();获得本类里的public权限修饰符构造函数,不能获取父类的

*  Constructor[] getDeclaredConstructor();得本类里的全部构造

*

*  ConstructorT getConstructor(Class...parameterType);用参数决定获得哪个构造方法

*  ConstructorT getDeclaredConstructor(Class...parameterType);

*

*/public class ConstructorInforGetter {

public static void main(String[] args) 

{

System.out.println("获得Cricle本类里的public权限修饰符构造函数,不能获取父类的Constructor[] getConstructor()");

System.out.println("子类继承不了父类中的构造方法和private");

//Constructor[] getConstructor()获得Cricle本类里的public权限修饰符构造函数,不能获取父类的

//子类继承不了父类中的构造方法和private

ClassCircle c1 = Circle.class;

Constructor?[] cons1 = c1.getConstructors();

for (Constructor? cons:cons1)

{

System.out.println(cons);

//System.out.println(cons.getName());

}

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

System.out.println("方法获得本类中的所有构造函数getDeclaredConstructor()");

Constructor?[] cons2 = c1.getDeclaredConstructors();

for (Constructor? cons:cons2)

{

System.out.println(cons);

}

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

try 

{

System.out.println("方法用参数指定获得本类!构造方法,只能获取public的ConstructorT getConstructor(Class...parameterType)");

Constructor? cons3 = c1.getConstructor(int.class);

System.out.println(Modifier.toString(cons3.getModifiers()));

System.out.println(cons3);

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

System.out.println("方法用参数指定获得本类!构造方法任何权限修饰符的都可以获得ConstructorT getDeclaredConstructor(Class...parameterType)");

Constructor? cons4 = c1.getDeclaredConstructor(String.class);

System.out.println(cons4);

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

/*

* JDK8.0之后新增的类

* Executable:

* 是Method和Constructor的父类

* 方法:

* getParameter();

* getExceptionTypes();

* getModifiers();

*          getTypeParameters();

*

*  Parameter:

*  封装并代表了参数实例

*/

System.out.println("获取类中方法的参数getParameters()");

Constructor? cons5 = c1.getDeclaredConstructor(int.class,String.class);

Parameter[] p1 = cons5.getParameters();

for (Parameter p:p1)

{

System.out.println(p);

}

} catch (NoSuchMethodException | SecurityException e) 

{

e.printStackTrace();

}

}}123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687

代码中提到的Circle类和Shape类二者为继承关系:

package LessonForReflection03;public class Circle extends Shape{

private int r;

private String color;

public Circle(int r, String color) 

{

super();

this.r = r;

this.color = color;

}

public Circle(int r) 

{

super();

this.r = r;

}

protected Circle(String color) 

{

super();

this.color = color;

}

Circle()

{

super();

}}12345678910111213141516171819202122232425262728293031

package LessonForReflection03;public class Shape {

private int per;

public Shape(int per) 

{

super();

this.per = per;

}

public Shape() 

{

super();

}}1234567891011121314151617

部分文字来源于:

咕嘟咖啡杨海滨老师 — 《java编程语言高级特性》

轻量化研习Java相关技术倡导者

“爱码学院”联合创始人自适应教学理念提出者践行者;多年开发及项目管理经历;出版《JavaEE企业级应用与开发》一书;10余年高校项目实践毕设指导经验;企业软培经验丰富

java反省的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于、java反省的信息别忘了在本站进行查找喔。

The End

发布于:2022-11-27,除非注明,否则均为首码项目网原创文章,转载请注明出处。