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

Java拾贝第十七天——反射之认识反射相关类

时间:2023-11-05 21:33:18浏览次数:24  
标签:lang 反射 Noodle Java String moudle2 java public 拾贝

反射相关类

在Java.lang.reflect包下有类:

Constructor:代表一个类中的构造方法
Field:代表一个类中的属性。
Method:代表一个类中的方法。

反射更加的体现Java一切皆对象这个概念

至此,Class类的常用方法如下:

方法 类型 描述
public Constructor<?>[] getConstructors() throws SecurityException 普通方法 获取一个类的全部构造方法
public Field[] getDeclaredFields() throws SecurityException 普通方法 获取一个类独有的全部属性
public Field[] getFields() throws SecurityException 普通方法 获取一个类继承自父类的公开属性
public Method[] getMethods() 普通方法 获取一个类的全部方法
public Method getMethod(String name, Class<?>... parameterTypes) throws NoSuchMethodException, SecurityException 普通方法 根据方法名及参数获取一个方法

还有一个Method类的特殊的方法

 public Object invoke(Object obj, Object... args)
        throws IllegalAccessException, IllegalArgumentException,InvocationTargetException


通常来说调用一个方法是:
类实例.对象方法();
类实例.对象方法(传参);


通过反射获取到Method方法后,调用方式如下:
方法对象.invoke(对象实例);
方法对象.invoke(对象实例,传参);

Class.newInstance()创建对象实例

public Constructor<?>[] getConstructors()

获取一个类的全部构造方法

栗子:

package moudle2;

import java.lang.reflect.Constructor;

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

            for (Constructor constructor : constructors) {
                System.out.println(constructor);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class Noodle {
    private String name = "面条";
    private double sale=20;

    public Noodle() {
    }
    public Noodle(double sale) {
        this.sale = sale;
    }
    public Noodle(String name, double sale) {
        this.name = name;
        this.sale = sale;
    }
}

程序运行结果:

public moudle2.Noodle()
public moudle2.Noodle(double)
public moudle2.Noodle(java.lang.String,double)

public Field[] getDeclaredFields()

获取一个类独有的全部属性(不论修饰符等级)

栗子:

package moudle2;

import java.lang.reflect.Field;

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

            for (Field field : fields) {
                System.out.println(field);
            }

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

class Noodle {
    private String name = "面条";
    private double sale = 20;
}

程序运行结果:

private java.lang.String moudle2.Noodle.name
private double moudle2.Noodle.sale

public Field[] getFields()

获取一个类继承自其父类的公开属性(非公共都不行)

栗子:

package moudle2;

import java.lang.reflect.Field;

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

            for (Field field : fields) {
                System.out.println(field);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class Noodle extends Rice {
    private String name = "面条";
    private double sale = 20;
}

class Rice {
    private String t1="t1";
    protected String t2="t2";
    public String t3="t3";

    static int i = 10;
    public static int x = 10;
}

程序运行结果:

public java.lang.String moudle2.Rice.t3
public static int moudle2.Rice.x

public Method[] getMethods()

获取一个类的全部方法

栗子:

package moudle2;

import java.lang.reflect.Method;

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

            for (Method method : methods) {
                System.out.println(method);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class Noodle  {
    private String name = "面条";
    private double sale = 20;

    public Noodle() {
    }

    public Noodle(String name, double sale) {
        this.name = name;
        this.sale = sale;
    }
}

程序运行结果:

public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()

从结果可以发现,不仅打印了Noodle类的方法,还打印了继承自Object类的方法。

public Method getMethod(String name, Class<?>... parameterTypes)

根据方法名获取方法
栗子:

package moudle2;

import java.lang.reflect.Method;

public class Test17 {
    public static void main(String[] args) {
        try {
            Class clazz = Class.forName("moudle2.Noodle");
            Method say = clazz.getMethod("say");
            System.out.println(say);

            Method say1 = clazz.getMethod("say", String.class, double.class);
            System.out.println(say1);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class Noodle {
    private String name ;
    private double sale ;

    public Noodle() {
    }
    public void say() {
        System.out.println("无参方法say");
    }
    public void say(String name, double sale) {
        System.out.println("有参方法say" + name + sale);
    }
}

程序运行结果:

public void moudle2.Noodle.say()
public void moudle2.Noodle.say(java.lang.String,double)

public Object invoke(Object obj, Object... args)

使用反射调用方法

栗子:

package moudle2;

import java.lang.reflect.Method;

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

            Method say1 = clazz.getMethod("say", String.class, double.class);
            say1.invoke(clazz.newInstance(),"带参",11);

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

class Noodle {
    private String name ;
    private double sale ;

    public Noodle() {
    }

    public void say() {
        System.out.println("无参方法say");
    }

    public void say(String name, double sale) {
        System.out.println("有参方法say" + name + sale);
    }
}

程序运行结果:

无参方法say
有参方法say带参11.0

标签:lang,反射,Noodle,Java,String,moudle2,java,public,拾贝
From: https://www.cnblogs.com/Ocraft/p/17811249.html

相关文章

  • Java之方法的基础知识
     1.方法概述1.1方法的概念方法(method)是程序中最小的执行单元注意:方法必须先创建才可以使用,该过程成为方法定义方法创建后并不是直接可以运行的,需要手动使用后,才执行,该过程成为方法调用2.方法的定义和调用2.1无参数方法定义和调用定义格式:publicstaticvoid方法名(){......
  • java实现线程的两种方式,举例说明
    在Java中,创建线程主要有两种方式:实现Runnable接口和继承Thread类。方式1:实现Runnable接口实现Runnable接口是创建线程的首选方式。你需要做的是实现Runnable接口的run方法。然后可以将Runnable对象作为参数传递给Thread对象,并启动该线程。publicclassHello......
  • java javaBean
    this关键字可以区别成员变量和局部变量构造方法构造方法也叫作构造器、构造函数。作用:在创建对象的时候给成员变量进行赋值的。如果我们自己没有写任何的构造方法那么虚拟机给我们加一个空参构造方法构造方法的定义:如果没有定义构造方法,系统将给出一个默认......
  • java string方法的具体讲解和举例说明
    在Java中,String类提供了一系列用于操作字符串的方法。下面是一些常用的String方法及其用法的示例:1.length()返回字符串的长度(字符数)。Stringstr="Hello";intlen=str.length();//len=52.charAt(intindex)返回指定索引处的字符。charch=str.charAt(0);//ch......
  • 使用java近似计算π的值实践
    使用蒙特卡罗方法近似计算π的值实践   蒙特卡罗方法是一种计算方法。原理是通过大量随机样本,去了解一个系统,进而得到所想要计算的值。是一种基于随机抽样的数值计算方法。这个方法的基本思想是在一个正方形内随机放置若干个点,并且判断每个点是否在以正方形中心为圆心、以正......
  • Java 操作 XML(15)--XOM 使用
    XOM是一个面向对象的XMLAPI,有点像DOM风格,但是许多功能使XOM与众不同,其中最主要的是严格维护内存对象中的不变性,以便始终可以将XOM实例序列化以更正XML。本文主要介绍使用XOM处理XML,文中所使用到的软件版本:Java1.8.0_341、XOM1.3.9。1、简介XOM被设计成易于学习和......
  • java基础:static静态代码块
    在Java中,静态代码块(staticblock)是在类加载时执行的,而不是在每次创建对象时执行的。当类被加载时,静态代码块会按照在类中出现的顺序被执行一次。这意味着无论创建多少个对象,静态代码块只会执行一次。具体执行时机如下:当类被首次加载时,静态代码块会被执行。类的加载通常发生在使用该......
  • Java21对虚拟线程进行http压测使用不同的GC
    JDK21默认GC是G1.JDK21除了G1外,还可以使用ZGC(Java11预览、Java15正式版),Java21在ZGC基础上继续推出了分代ZGC,目前还是试行阶段。开启ZGC:java-XX:+UseZGC-jarmyapp.jar开启ZGC,并试用分代ZGCjava-XX:+UseZGC-XX:+ZGenerational-jarmyapp.jar以下的对一个启用tomcat......
  • java 模板
    1.添加依赖:<dependencies><!--支持模板--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-freemarker</artifactId></dependency></dependencies>注:......
  • java.time.format.DateTimeParseException: Text ‘202310132358‘ could not be pars
    你遇到的问题是由于在解析日期和时间时格式不正确。Java无法解析‘202310132358’这个字符串,因为它不符合Java日期时间格式。Java期望的日期时间格式通常是“yyyy-MM-ddHH:mm:ss”,其中:yyyy是四位数的年份MM是两位数的月份dd是两位数的日期HH是两位数的小时(24小时制)mm是两......