Java反射
文章目录
Class——代表字节码的类
1、Class对象
在Java世界里,一切皆对象。从某种意义上来说,Java有两种对象:实例对象和Class对象。每个类运行时的类型信息就是用Class对象表示的。它包含了与类有关的信息,我们的实例对象就通过Class对象来创建的。
每一个类都有一个Class对象,编译一个新类就产生一个Class对象.
Class类没有公共的构造方法,因此不能显式地声明一个Class对象。不允许手动的去new一个Class对象。
2、获取Class对象的三种方法
- 通过 类名.class 获取
- 通过对象的 getClass() 方法获取
- 通过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 + '\'' +
'}';
}
}
运行结果: