首页 > 编程语言 >Java反射

Java反射

时间:2023-09-17 20:25:11浏览次数:37  
标签:反射 Java Cat 获取 修饰 父类 public 属性

声明:本文记录基于 JDK 8(8u211)的继承使用规则如果存在错误,请发邮件至[email protected] 联系我
创作时间:2023-09-16 17:00:21
创作情况:失业第46天,地处成都金牛区
创作者:一口吃不成胖子

反射

准备工作,以供对照描述与代码,想看结论直接到文末尾

父类

package com.beans;
/**
 * 抽象父类 Animal
 *
 * */
abstract class Animal {
    public String AnimalName;
    public Integer AnimalAge;
    public void desc(){
        System.out.println(this.AnimalName+"---"+this.AnimalAge);
    }
    abstract public void bark();
}

子类

package com.beans;

public class Cat extends Animal {
    public Cat(){
        
    }
    private Cat(String petName){
        this.petName = petName;
    }
    private Cat(Double price){
        this.price = price;
    }
    public Cat(String petName,Double price){
        this.petName = petName;
        this.price = price;
    }

    private String petName;
    private Double price;
    @Override
    public void bark() {
        System.out.println("喵");
    }

    public void catDesc(){
        System.out.println(this.AnimalName+"+++"+this.AnimalAge);
    }
}

获取类

  • Class.forName(全类名)

  • 类名.class

Class animalClass = Class.forName("com.beans.Cat");
class catClass = Cat.class;

获取构造器

  • getDeclaredConstructors():获取本类所有构造器
  • getDeclaredConstructor(参数类...):获取本类所有构造器的某一个
  • getConstructors():获取本类中public修饰的构造器
  • getConstructor(参数类...):获取本类public修饰的构造器中的符合参数的顺序和类型构造器
  • newInstance(参数...):调用构造器实例化对象
Constructor con = animalClass.getConstructor(null);//获取指定的且被public修饰的构造方法
Cat miao = (Cat) con.newInstance(null);// 实例化对象

Constructor[] constructors = animalClass.getDeclaredConstructors();//获取所有构造对象,包括被private修饰的
for (Constructor constructor : constructors) {
    System.out.println(constructor.getParameterCount());
    Parameter[] parameters = constructor.getParameters();//获取构造方法参数
    for (Parameter parameter : parameters) {
         System.out.println(parameter.getName()+"--"+ parameter.getType());
    }
}

获取方法

  • getDeclaredMethods():获取所有方法,不包括继承父类的,但包括重写的。
  • getDeclaredMethod(方法名,参数类...):获取所有方法中的某个方法,不包括继承父类的,但包括重写的。
  • getMethods():获取所有public修饰的方法,包括继承父类的public方法
  • getMethod(方法名,参数类...):获取public修饰的方法中的某个方法,包括继承父类的public方法
  • getParameters():获取方法的所有参数
  • invoke(对象,参数...):执行对象
  • setAccessible(布尔):放开/禁止可访问权限(仅类中是public修饰的方法不用调用此方法,访问继承于父类中是public修饰的方法则需要调用)
Method[] methods = animalClass.getDeclaredMethods();//获取所有方法
for (Method method : methods) {
	int parameter_count = method.getParameterCount();//获取参数个数
	System.out.println(method.getName()+"---"+parameter_count);
    for (Parameter parameter : parameters) {
         String para_name = parameter.getName();//并不是真正的参数名,而是arg0,arg1...
         Type type = parameter.getType();
         System.out.println(para_name+"---"+type.getTypeName());//打印参数名和参数类型
    }
    
	Parameter[] parameters = method.getParameters();//获取参数
    if ( parameters.length == 0){
           method.invoke((Cat)animalClass.newInstance());//执行方法
    }
}

获取属性

  • getFields():获取所有public修饰的属性,包括继承于父类的。
  • getField(属性名):获取public修饰的属性中某个属性,包括继承于父类的。
  • getDeclaredFields():获取所有属性,不包括父类的。
  • getDeclaredField(属性名):获取所有属性中某个属性,不包括父类的。
  • set(对象,值):为某一个对象的该属性赋值
  • get(对象):获取对象的该属性值。
  • setAccessible(布尔):放开/禁止可访问权限(仅类中是public修饰的属性不用调用此方法,访问继承于父类中是public修饰的属性则需要调用)
Field[] fields = animalClass.getFields();
for (Field field : fields) {
     System.out.println(field.getName()+"---"+field.getType());
}
Field f = animalClass.getField("AnimalName");// 获取public修饰的AnimalName属性
Cat cat = (Cat) animalClass.newInstance();
f.setAccessible(true);// 放开权限,因为AnimalName是从父类中继承的public属性,需要打开访问权限
f.set(cat,"小毛");//赋值
System.out.println(f.get(cat));//取值

标签:反射,Java,Cat,获取,修饰,父类,public,属性
From: https://www.cnblogs.com/JarryShu/p/17708306.html

相关文章

  • 【java基础】Token令牌生成 token加密串 生成token Aes加密 Base64加密 JWT 【附
    先看效果:Token令牌-生成工具包括:头部(header)+载荷(payload)+签证(signature) 可以自定义加密盐: 源码:地址一:GitLab地址二:123盘地址三:百度盘提取码:666 ......
  • 无涯教程-JavaScript - EXP函数
    描述EXP函数返回e升至数字的幂。常数e等于自然对数的底数2.71828182845904。语法EXP(number)争论Argument描述Required/OptionalNumberTheexponentappliedtothebasee.RequiredNotes要计算其他碱基的幂,请使用幂运算符(^)EXP是LN的倒数,LN是数字的自然......
  • 八大排序算法介绍及其Java实现
    八大排序算法包括:冒泡排序(BubbleSort)选择排序(SelectionSort)插入排序(InsertionSort)希尔排序(ShellSort)归并排序(MergeSort)快速排序(QuickSort)堆排序(HeapSort)计数排序(CountingSort)下面是它们的复杂度、应用场景以及Java语言描述算法:冒泡排序复杂度:最坏情况下需要O(n^2)的时间复......
  • Java环境配置及实战一个Java应用程序
    【前言】在开始编写Java应用程序之前,需要先进行Java环境的配置。本文将介绍如何配置Java环境,并展示一个简单的Java输出示例。读者可以通过本文了解如何正确配置Java环境以及编写并运行Java代码。【摘要】本文将展示如何配置Java环境,并编写一个简单的Java输出示例。通过该示例,读者......
  • 无涯教程-JavaScript - EVEN函数
    描述EVEN函数返回四舍五入到最接近的偶数整数的数字。您可以使用此功能来处理两个项目。语法EVEN(number)争论Argument描述Required/OptionalNumberThevaluetoround.RequiredNotes如果数字为非数字,则EVEN返回#VALUE!错误值。不管数字的符号如何,当从零开......
  • 《Java编程思想第四版》学习笔记28--关于StreamTokenizer
    //:SortedWordCount.java//Countswordsinafile,outputs//resultsinsortedform.importjava.io.*;importjava.util.*;importc08.*;//ContainsStrSortVectorclassCounter{privateinti=1;intread(){returni;}voidincrement(){i++;}}pu......
  • java中使用JNA调用C/C++动态链接库中的函数
    目录C++部分创建动态库项目JAVA部分pom依赖工程结构测试类jna提供C与JAVA数据类型映射参考C++部分创建动态库项目注意:动态库中的头文件,必须要将需要导出的函数包裹在extern"C"{}中,否者在使用侧java工程中,就无法加载并使用JAVA部分pom依赖<dependencies><dependenc......
  • 认识Java及实现第一个Java应用程序
    【前言】Java是一种广泛使用的高级编程语言,具有面向对象、跨平台等特性,被广泛应用于Web开发、移动应用开发、桌面应用程序等领域。本文将介绍一个简单的Java应用程序,并对其进行代码实现和总结。【摘要】本文将展示一个简单的Java应用程序,实现了一个输出"Hello,Java!"的示例。通过......
  • 无涯教程-JavaScript - DEGREES函数
    描述DEGREES函数将弧度转换为度。语法DEGREES(angle)争论Argument描述Required/OptionalAngleTheangleinradiansthatyouwanttoconvert.RequiredNotes弧度和度之间的转换由以下关系式计算180度=π弧度其中π是数学常数,PI=3.14159265358979...适用性E......
  • JavaScript 创建并初始化任意长度的数组
    直接定义vararr=[0,0,0,0,0];//[0,0,0,0,0]使用push()方法vararr=[];for(leti=0;i<5;i++){arr.push(0);}//[0,0,0,0,0]使用Array构造函数和fill()方法vararr=newArray(5);//[empty×5]arr.fill(0);//[0......