首页 > 编程语言 >JAVA--异常

JAVA--异常

时间:2023-10-02 17:23:01浏览次数:34  
标签:JAVA String -- age Student println 异常 public name

什么是反射?

可以从类里面将该类的成员方法成员变量,构造方法的信息给拿出来

image-20231002150155173

使用可以获取成员变量,构造方法,成员方法的所有信息.

image-20231002150508560

学习反射应该学习如何获取和解剖

image-20231002150630025

获取class对象的三种方式

image-20231002151024153

  1. 在源代码阶段使用Class.forName("全类名");(最常用)

  2. 在加载阶段使用A.class(一般更多是当作参数传递)

  3. 在运行阶段使用对象.getClass();(已经有了这个类的对象才能使用)

    代码演示

    public class MyReflectDemo01 {
        public static void main(String[] args) throws ClassNotFoundException {
            //1.第一种方式
            //全类名:包名+类名 Student
            Class clazz = Class.forName("Student");
            //打印
            System.out.println(clazz);
            //第二种方式
            Class clazz2 = Student.class;
            //打印
            System.out.println(clazz2);
            System.out.println(clazz == clazz2);//两个获取的是一个对象
            //第三种方式
            Student s = new Student();
            Class clazz3 = s.getClass();
            System.out.println(clazz3);
            //获取的字节码文件对象是一样的
            System.out.println(clazz3 == clazz2);
            System.out.println(clazz2 == clazz);
        }
    }
    

    下面是一个标准的Java类

    public class Student {
        private String name;
        private int age;
    
        public Student() {
        }
    
        public Student(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    }
    
    

利用反射获取构造方法

在Java当中万物皆可对象,所以如图所示: Class有对象,构造方法有对象,成员变量和成员方法也有对象

image-20231002153113862

image-20231002153420774

  1. 返回所有public修饰的构造方法
  2. 返回所有的构造方法
  3. 返回单个的public修饰的构造方法
  4. 返回单个的构造方法

一个Student类

public class Student {
    private String name;
    private int age;

    private Student(int age) {
        this.age = age;
    }

    private Student(String name) {
        this.name = name;
    }

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

反射的各种方法

import java.lang.reflect.Constructor;
import java.lang.reflect.Parameter;

public class MyReflectDemo02 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {
        //获取class字节码文件对象
        Class clazz = Class.forName("Student");
        //获取public构造方法
        /*
        Constructor[] cons =clazz.getConstructors();
        for (Constructor con : cons) {
            System.out.println(con);
        }
        */
        //获取所有构造方法
//        Constructor[] con1 =clazz.getDeclaredConstructors();
//        for (Constructor con : con1) {
//            System.out.println(con);
//        }
        //获取单个构造方法
//        Constructor con1 = clazz.getDeclaredConstructor();
//        System.out.println(con1);
//        //向里面传递的是字节码文件
//        Constructor con2 = clazz.getDeclaredConstructor(String.class);
//        System.out.println(con2);
//        Constructor con3 = clazz.getDeclaredConstructor(int.class);
//        System.out.println(con3);
        Constructor con4 = clazz.getDeclaredConstructor(String.class, int.class);
//        System.out.println(con4);
//        int modifiers = con4.getModifiers();//可以获取权限修饰符
//        System.out.println(modifiers);
//        Student stu = new Student();
//        Parameter[] parameters = con4.getParameters();
//        for (Parameter parameter : parameters) {
//            System.out.println(parameter);
//        }
    }
}

使用反射创建对象

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Parameter;

public class MyReflectDemo02 {

    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        //获取class字节码文件对象
        Class clazz = Class.forName("Student");
        Constructor con3 = clazz.getDeclaredConstructor(String.class);
        //暴力反射:临时取消权限校验
        con3.setAccessible(true);
        Student stu = (Student) con3.newInstance("张三");//本身为private修饰
        System.out.println(stu);
    }
}

反射获取成员变量

image-20231002160619949

一个Student类

public class Student {
    private String name;
    private int age;
    public String gender;

    public Student() {
    }

    public Student(String name, int age, String gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }
}

使用反射获取成员变量之后的各种操作

import java.lang.reflect.Field;

public class MyReflectDemo01 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
        //1.获取class字节码文件的对象
        Class clazz = Class.forName("Student");
        //2.获取成员变量
//        Field[] fields = clazz.getFields();
        //获取所有成员变量
//        Field[] fields = clazz.getDeclaredFields();
//        for (Field field : fields) {
//            System.out.println(field);
//        }
        //获取单个public成员变量
//        Field gender = clazz.getField("gender");
//        System.out.println(gender);
//        获取单个成员变量
        Field name = clazz.getDeclaredField("name");
        System.out.println(name);
        //获取权限修饰符(也是int类型整数)
        int modifiers = name.getModifiers();
        System.out.println(modifiers);
        //获取变量名
        String n = name.getName();
        System.out.println(n);
        //获取成员变量数据类型
        Class<?> type = name.getType();
        System.out.println(type);
        //获取成员变量记录的值
        Student s = new Student("zhangsan", 23, "男");
        name.setAccessible(true);//临时取消访问权限
        String value = (String) name.get(s);
        System.out.println(value);
        //修改对象里面的值
        name.set(s, "lisi");
        System.out.println(s);

    }
}

反射获取成员方法

image-20231002163804063

一个Student类

import java.io.IOException;

public class Student {
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void sleep() {
        System.out.println("睡觉");
    }

    private String eat(String something) throws IOException, NullPointerException {
        System.out.println("在吃" + something);
        return "奥里给";
    }

    private String eat(String something, int a) {
        System.out.println("在吃" + something);
        return "奥里给";
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

使用反射调用成员方法的各种操作

import java.io.PrintStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;

public class MyReflectDemo03 {

    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        //1.获取字节码文件对象
        Class clazz = Class.forName("Student");
        //2.获取里面所有的方法对象(包含父类所有的公共方法)
//        Method[] methods = clazz.getMethods();
//        for (Method method : methods) {
//            System.out.println(method);
//        }
        //获取里面所有的方法对象(不可获取父类的公共方法),但是可以获取本类中私有的方法
//        Method[] methods = clazz.getDeclaredMethods();
//        for (Method method : methods) {
//            System.out.println(method);
//        }
        //获取指定的单一方法
        Method m = clazz.getDeclaredMethod("eat", String.class);
        System.out.println(m);
        //获取方法修饰符
        int modifiers = m.getModifiers();
        System.out.println(m);
        //方法的名字
        String name = m.getName();
        System.out.println(name);
        //获取方法的形参
        Parameter[] parameters = m.getParameters();
        for (Parameter parameter : parameters) {
            System.out.println(parameter);
        }
        //获取方法抛出的异常
        Class[] exceptionTypes = m.getExceptionTypes();
        for (Class exceptionType : exceptionTypes) {
            System.out.println(exceptionType);
        }
        //方法运行 invoke方法
        Student s = new Student();
        //参数1:表示方法的调用者
        //参数2:表示在调用方法的时候传递的实际参数
        m.setAccessible(true);
        m.invoke(s, "汉堡");
        //如果方法带返回值的话
        Object result = m.invoke(s, "汉堡包");
        System.out.println(result);
    }
}

标签:JAVA,String,--,age,Student,println,异常,public,name
From: https://www.cnblogs.com/harper886/p/17740248.html

相关文章

  • 自定义数据类型和数据类型别名
    自定义数据类型和数据类型别名代码//example.gopackagetestimport"fmt"funcTestFunction(){ fmt.Println("自定义类型") //自定义类型mesType,它是uint16的别名 //注意:虽然mesType是uint16的别名,但是二者仍是不同类型,不能够 //相互赋值和比较,需要进行类型转换 //......
  • C:\Windows\Panther\UnattendGC\setupact.txt是Windows系统安装过程中的一个日志
    C:\Windows\Panther\UnattendGC\setupact.txt是Windows系统安装过程中的一个日志文件,用于记录系统安装过程中发生的事件和错误。它通常会包含有关安装过程中各个阶段的详细信息,例如硬件检测、驱动程序安装、应用程序安装等等。如果您遇到了系统安装问题,可以查看这个文件以获取更多......
  • CNVD原创漏洞证书(五)(六)
    新华三命令执行漏洞明御网关命令执行漏洞......
  • Mybatis入门 下
    2.JDBC介绍(了解)2.1介绍通过Mybatis的快速入门,我们明白了,通过Mybatis可以很方便的进行数据库的访问操作。但是大家要明白,其实java语言操作数据库呢,只能通过一种方式:使用sun公司提供的JDBC规范。Mybatis框架,就是对原始的JDBC程序的封装。那到底什么是JDBC呢,接下来,我们就来介......
  • 基本运算符
    publicclassDome10{publicstaticvoidmain(String[]args){//二元运算符//Ctrl+D:复制当前行到下一行inta=10;intb=20;intc=25;intd=25;System.out.println(a+b);System.out.println(a-b)......
  • 安卓手机关闭5G方法
    关闭5G网络方法:【方法①】您可以进入设置--双卡和移动网络/移动网络--关闭“启用5G”开关即可。【方法②】打开手机拨号盘,输入*#*#2288#*#*,将“网络模式”设置为:4G(优先)/3G/2G,即可关闭。☞如果页面没有“启用5G”开关”开关,可以将“网络模式”设置为:4G(优先)/3G/2G,此后手机将不会......
  • 二叉树遍历(先序遍历)
    口诀:先根再左再右......
  • 【C语言入门】第二天
    【例题1】2235.两整数相加-力扣(LeetCode)intsum(intnum1,intnum2){returnnum1+num2;}【例题2】1812.判断国际象棋棋盘中一个格子的颜色-力扣(LeetCode)boolsquareIsWhite(char*coordinates){switch(coordinates[0]){case'a':case'c':case'e......
  • 小程序 | 微信小程序使用空格占位符无效解决方法 | 前端
    小程序|微信小程序使用空格占位符无效解决方法|前端问题描述最近在写微信小程序时,想给文本添加空格,尝试使用键盘空格、标签加空格、HTML的&nbsp;等等都没有效果,最后在微信小程序官方文档中找到了解决办法解决方法查阅官方相关文档介绍微信小程序官方文档uniapp官方......
  • 工具 | 全网仅存、功能强大的几款文库下载器
    工具|全网仅存、功能强大的几款文库下载器前言有很多小伙伴问有没有免费下载文库资源的软件。我们都知道,经常访问的百度文库、豆丁、道客巴巴等等,这些资源平台都不是免费的。本期内容主要汇总了网络上推荐的免费下载文库的方式资源下载小叶文库下载器下载:https://appleex......