MyBatis反射(reflect)

*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;
    }
}

解释:

  1. 人往像中对应位置操作,最后作用到人脸的对应的部反射,让程序看自己的功能
  2. 在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));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值