Java反射---剖析类,对类进行剖析

Java反射

Class——代表字节码的类

1、Class对象

在Java世界里,一切皆对象。从某种意义上来说,Java有两种对象:实例对象和Class对象。每个类运行时的类型信息就是用Class对象表示的。它包含了与类有关的信息,我们的实例对象就通过Class对象来创建的。

每一个类都有一个Class对象,编译一个新类就产生一个Class对象.
Class类没有公共的构造方法,因此不能显式地声明一个Class对象。不允许手动的去new一个Class对象。

2、获取Class对象的三种方法
  1. 通过 类名.class 获取
  2. 通过对象的 getClass() 方法获取
  3. 通过Class.forName(“类的全类名”)获取
package pers.kuroko.reflect;

public class Demo1 {

    public static void main(String[] args) throws ClassNotFoundException {
        //1.通过类名.class获取一个字节码对象
        //clz代表的是String类的字节码
        Class clz = String.class;
        System.out.println(clz);

        //2.通过getClass()获取一个字节码对象
        Integer i = 9;
        //获取i所对应的类的字节码
        Class clz2 = i.getClass();
        System.out.println(clz2);

        //3.通过Class.forName("全类名")来获取一个字节码对象,要求传入类的全类名
        Class clz3 = Class.forName("java.util.List");
        System.out.println(clz3);
    }

}

运行结果:
在这里插入图片描述

Constructor——代表构造方法的类

通过class对象创建实例对象
package pers.kuroko.book;
//Book类
public class Book {

    private String bname;
    private Integer price;
    private String author;

    public Book() {
    }

    public Book(String bname, Integer price, String author) {
        this.bname = bname;
        this.price = price;
        this.author = author;
    }

    @Override
    public String toString() {
        return "Book{" +
                "bname='" + bname + '\'' +
                ", price=" + price +
                ", author='" + author + '\'' +
                '}';
    }

}
package pers.kuroko.reflect;

import pers.kuroko.book.Book;

import java.lang.reflect.Constructor;

public class Demo2 {

    public static void main(String[] args) throws Exception {
        // 获取String类的字节码
        Class<String> clz = String.class;
        // 如何利用clz来创建一个实例对象?
        // 要求对应的类中必须提供无参构造
        String s = clz.newInstance();
        System.out.println("这是字符串对象--"+s);

        Class<Integer> inc = Integer.class;
        // 获取指定的构造函数对象
        //这里是获取Integer类的参数为 int 的构造函数
        Constructor<Integer> c = inc.getConstructor(int.class);
        Integer in = c.newInstance(5);
        System.out.println(in);

        Class<Book> bc=Book.class;
        //获取Book类的有参构造
        Constructor<Book> cst=bc.getConstructor(String.class,Integer.class,String.class);
        Book book = cst.newInstance("Java EE",32,"张三");
        System.out.println(book);

    }

}

运行结果:
在这里插入图片描述

Method——代表方法的类

package pers.kuroko.reflect;

import pers.kuroko.book.Book;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

public class Demo33 {

    public static void main(String[] args) throws Exception {
        //获取Book类的字节码
        Class<Book> clz = Book.class;
        // 获取指定的公有的构造方法
        Constructor<Book> ccc = clz.getConstructor(String.class, Integer.class,String.class);
        Book book1 = ccc.newInstance("Java web",48,"李四");
        System.out.println(book1);

        // 获取指定的构造方法
        Constructor<Book> c = clz.getDeclaredConstructor(String.class);
        // 暴力破解,获取非公有的有参构造方法
        c.setAccessible(true);
        Book book2 = c.newInstance("Java从入门到精通");
        System.out.println(book2);

        // save(String bname)
        // 获取了指定的公有的方法
        Method m = clz.getMethod("save",String.class);
        // 第一个参数表示方法要作用的对象
        // 第二个参数表示这个方法执行所需要的参数
        // 在指定对象身上执行了指定的方法
        String message=(String)m.invoke(book1, "PHP web");//相当于book1.save("PHP web")
        System.out.println(message);
        
        //private void modify(String bname)
        // 获取指定的方法
        Method m2 = clz.getDeclaredMethod("modify",String.class);
        // 暴力拆除
        m2.setAccessible(true);
        m2.invoke(book1, "PHP web123");//相当于book1.modify("PHP web123")

    }

}
package pers.kuroko.book;

public class Book {

    private String bname;
    private Integer price;
    private String author;

    public Book() {
    }

    public Book(String bname, Integer price, String author) {
        this.bname = bname;
        this.price = price;
        this.author = author;
    }

    Book(String bname){
        this.bname=bname;
    }
    public String save(String bname){
        return bname+"被保存!";
    }
    private void modify(String bname){
        System.out.println(bname+"被修改!");
    }
    public void delete(String bname){
        System.out.println(bname+"删除!");
    }


    @Override
    public String toString() {
        return "Book{" +
                "bname='" + bname + '\'' +
                ", price=" + price +
                ", author='" + author + '\'' +
                '}';
    }

}

运行截图:
在这里插入图片描述

Field——代表属性的类

package pers.kuroko.reflect;

import pers.kuroko.book.Book;

import java.lang.reflect.Field;

public class Demo4 {
    
    public static void main(String[] args) throws Exception {
        //获取Book类的字节码
        Class<Book> clz = Book.class;
        Book b = (Book)clz.newInstance();

        //获取指定的属性对象
        Field f = clz.getDeclaredField("bname");
        f.setAccessible(true);
        System.out.println(f);

        //在指定对象身上给指定的属性设置值
        f.set(b, "Java Web");
        System.out.println(f.get(b));
    }

}
package pers.kuroko.book;

public class Book {

    private String bname;
    private Integer price;
    private String author;

    public Book() {
    }

    public Book(String bname, Integer price, String author) {
        this.bname = bname;
        this.price = price;
        this.author = author;
    }

    Book(String bname){
        this.bname=bname;
    }
    public String save(String bname){
        return bname+"被保存!";
    }
    private void modify(String bname){
        System.out.println(bname+"被修改!");
    }
    public void delete(String bname){
        System.out.println(bname+"删除!");
    }


    @Override
    public String toString() {
        return "Book{" +
                "bname='" + bname + '\'' +
                ", price=" + price +
                ", author='" + author + '\'' +
                '}';
    }

}

运行结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值