前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >book-sample 模块下的 class 不能位于 main 模块启动时

book-sample 模块下的 class 不能位于 main 模块启动时

原创
作者头像
用户7737280
发布2024-08-26 13:28:27
810
发布2024-08-26 13:28:27

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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档