*MyBatis反射(reflect)
Demo Book.java
package cn.edu.xcu.reflect.entity;
import java.util.Date;
public class Book {
private int id;
private String name;
private String author;
private int tid;
private double price;
private String descri;
private String photo;
private Date pubdate;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public int getTid() {
return tid;
}
public void setTid(int tid) {
this.tid = tid;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public String getDescri() {
return descri;
}
public void setDescri(String descri) {
this.descri = descri;
}
public String getPhoto() {
return photo;
}
public void setPhoto(String photo) {
this.photo = photo;
}
public Date getPubdate() {
return pubdate;
}
public void setPubdate(Date pubdate) {
this.pubdate = pubdate;
}
public Book() {
super();
}
@Override
public String toString() {
return "Book [id=" + id + ", name=" + name + ", author=" + author + ", tid=" + tid + ", price=" + price
+ ", descri=" + descri + ", photo=" + photo + ", pubdate=" + pubdate + "]";
}
private void test() {
}
Book(int id){
this.id=id;
}
}
解释:
- 人往像中对应位置操作,最后作用到人脸的对应的部反射,让程序看自己的功能
- 在java中一切都是对象,该像类型是java.lang.Class类型。跟先手世界类比,我们通过“像”就可以看到类的功能:
继承了哪个
实现类什么接口
构造函数
方法等内容
1 学习寻找镜像(照相法)
通过静态属性class
Class<Book> clazz1=Book.class
Class的静态方法forName传入类的全限定名(包名+类名)
此方法最好,程序员告诉类,框架提前写好,类是动态变化的
Class clazz1=Class.forName("cn.edu.xcu.reflect.entity.Book")
通过对象getClass方法
Book book=new Book();
Class<Book> clazz1=(Class<Book>) book.getClass();
#补充 如何实现第二种照相法的类的动态变化
Properties pro=new Propperties();
//如果一个文件和类放在同一个包下的情况下
pro.load(ReflectDemo02.class.getResourceAsStream("reflect.properties"));
//照相
Class clazz1=Class.forName(pro.getProperty("entity"));
System.out.println(clazz1);
在src/test/resources目录下放置reflect.properties文件
entity=cn.edu.xcu.reflect.entity.Type
2 学习查看源类
查看父类
//照相法1 通过静态属性class
Class<Book> clazz1=Book.class;
System.out.println("查看父类");
System.out.println(clazz1.getSuperclass());
查看实现接口
System.out.println("查看实现接口");
Class[] cls=clazz1.getInterfaces();
for(Class class1:cls){
System.out.println(class1);
}
查看构造函数
查看所有构造函数
System.out.println("查看所有构造函数");
Constructor[] cs1=clazz1.getDeclaredConstructors();
for(Constructor constructor:cs1){
System.out.println(constructor);
}
查看所有public构造函数
System.out.println("查看所有的public的函数");
Constructor[] cs2=clazz1.getConstructors();
for(Constructor constructor:cs2){
System.out.println(constructor);
}
查看某个公有的
System.out.println("查看某个公有的");
Constructor cs3=clazz1.getConstructor();
System.out.println(cs3);
查看方法
查看所有公有方法,包括继承
Class<Book> clazz1=Book.class;
//查看所有公有方法,包括继承
Method[] ms1=clazz1.getMethods();
for(Method method:ms1){
System.out.println(method);
}
查看本类定义方法,不包括继承
//查看本类定义的方法,不包括继承的方法
Method[] ms2=clazz1.getDeclaredMethods();
for(Method method:ms2){
System.out.println(method);
}
查看某个公有的
Method m1=clazz1.getMethod("setPubdate",Date.class);
System.out.println(m1);
查看本类本类定义的方法
Method m3=clazz1.getDeclaredMethod("setPubdate",Date.class);
System.out.println(m3);
Method m4=clazz1.getDeclaredMethod("test");
System.out.println(m4);
3 找到调用构造函数,并调用像的方法(输出Book类)
//1找到像
Class<Book> clazz1=Book.class;
//简化操作
Book book=clazz1.newInstance();
System.out.println(book);
4 自己调用构造函数,并赋值,调用
1 使用invoke(调用)
/自己调用:1对象2方法3参数
Method m1=clazz1.getDeclaredMethod("setName", String.class);
//调用方法
m1.invoke(book, "dasb");
System.out.println(book);
Method m2=clazz1.getDeclaredMethod("getName");
String ret=(String) m2.invoke(book);
System.out.println(ret);
2 使用file
//1找到像
Class<Book> clazz1=Book.class;
//简化操作,直接调用像的方法
Book book=clazz1.newInstance();
System.out.println(book);
//2找到字段
Field f1=clazz1.getDeclaredField("name");
//3赋值:如果是对象类型set(object,value),如果基本类型setBoolean等
f1.setAccessible(true);
f1.set(book, "dasb");
//4取值:对象类型调用get基本类型boolean
System.out.println(f1.get(book));