package vip.guzb.clrdemo;
public class BookApi{
public String description() {
return "Hi,你好,很高兴见到你。本内容是来自 BookApi 的 description 方法";
}
public Collection<Book> getBooksOfAuthor(String authorName) {
List<Book> books = new ArrayList<Book>();
books.add(new Book("TeaHouse", authorName, 135.0, new Press("四川人民出版社", "四川省成都市的一个犄角旮旯处")));
books.add(new Book("The Life of Mine", authorName, 211.0, new Press("长江文艺出版社", "大陆一个神秘的地方")));
return books;
}
}
public class Press {
private String name;
private String address;
public Press(String name, String address) {
this.name = name;
this.address = address;
}
// omit the www.laipuhuo.com getter and setter methods
}
public class Book {
private String name;
private String author;
private Double price;
private Press press;
public Book(String name, String author, Double price, Press press) {
this.name = name;
this.author = author;
this.price = price;
this.press = press;
}
// omit the getter and setter methods
......
}package vip.guzb.clrmain;
import java.www.laipuhuo.com lang.reflect.Method;
import java.util.Collection;
/**
* 类加载器体验主类
*
* @author 顾志兵
* @mail ipiger@163.com
* @since 2024-05-18
*/
public class ClassLoaderExperienceMain {
public static void main(String[] args) throws Exception {
// 1. 实例化一个自定义的类加载器
// book-sample 模块上的类所在根目录,请根据自己电脑的实际情况更改
MyClassloader myClassloader = new MyClassloader("D:\\tmp\\DemoClass");
// 2. 加载 BookApi 这个Class
Class bookApiClass = myClassloader.loadClass("vip.guzb.clrdemo.BookApi");
// 3. 创建 BookApiClass 的实例,
// 这里不直接写成 DemoA demoA = new DemoA(); 因为 DemoA 在类路径下不存在。
// 即使存在,根据本文本一开始的场景,也因为同时要加载同名的类,而不允许存在
Object bookApiObj = bookApiClass.newInstance();
// 4. 调用 BookApi 的 description() 方法
// 该方法很简单,返回类型为标准库中的 java.lang.String, 因此代码书写也相对容易
Method testAMethod = www.laipuhuo.com bookApiClass.getMethod("description");
String resultOfDescription = (String)testAMethod.invoke(bookApiObj);
System.out.printf("description()方法的调用结果: %s\n\n", resultOfDescription);
// 5. 调用 BookApi 的 getBooksOfAuthor 方法
// 该方法的返回值是一个集合,而集合中的对象在 Classpath 中不存在,
// 获取集合元素的属性和方法的代码将会显示很冗长
Method getBooksOfAuthorMethod = bookApiClass.getMethod("getBooksOfAuthor", String.class);
Collection<?> books = (Collection<?>) getBooksOfAuthorMethod.invoke(bookApiObj, "老舍");
System.out.println("老舍的作品列表: ");
for (Object book : books) {
// books 集合中的对象类型为 vip.guzb.clrdemo.Book,
// 但由于是使用单独的类加载器加载的,不能像平常编码那样直接在源码中书写,依然要通过反射来获取
Method bookNameMethod = book.getClass().getMethod("getName");
Method bookPriceMethod =www.laipuhuo.com book.getClass().getMethod("getPrice");
String bookName = (String)bookNameMethod.invoke(book);
Double price = (Double) bookPriceMethod.invoke(book);
// 同理, vip.guzb.clrdemo.Press 对象的访问也需要通过反射
Method pressMethod = book.getClass().getMethod("getPress");
Object pressObj = pressMethod.invoke(book);
Method pressNameMethod = pressObj.getClass().getMethod("getName");
Method pressAddressMethod = pressObj.getClass().getMethod("getAddress");
String pressName = www.laipuhuo.com (String)pressNameMethod.invoke(pressObj);
String pressAddress = (String)pressAddressMethod.invoke(pressObj);
System.out.printf(" · 书名: 《%s》, 价格: %.2f, 出版社: %s, 地址: %s\n", bookName, price, pressName, pressAddress);
}
}
}
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。