题目描述:在某应用软件中需要记录业务方法的调用日志,在不修改现有业务类的基础上为每一个类提供一个日志记录代理类,在代理类中输出日志。如在业务方法method()调用之前输出“method方法被调用,调用时间为2019-10-19 10:20:30”,调用之后如果没有抛出异常则输出方法“方法method调用成功”,否则输出“方法method调用失败”。
实现截图:
UML图:
AbstractLog.java
package software_proxy_3;
public class AbstractLog {
public void method(){};
}
LogProxy.java
package software_proxy_3;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.lang.String;
public class LogProxy extends AbstractLog {
// private LogRecord logRecord = new LogRecord();
private AbstractLog logRecord = new AbstractLog();
private SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
private String time = SDF.format(new Date());
public void method() {
System.out.println("方法Method被调用,调用时间为:" + time);
try {
logRecord.method();
System.out.println("方法method()调用成功");
}catch(Exception e) {
System.out.println("方法method()调用失败");
}
}
}
LogRecord.java
package software_proxy_3;
public class LogRecord extends AbstractLog{
public void method() {
System.out.println("真实业务方法");
}
}
XMLUtil.java
package software_proxy_3;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import java.io.*;
public class XMLUtil {
public static Object getBean() {
try {
DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dFactory.newDocumentBuilder();
Document doc;
doc = builder.parse(new File("src/config.xml"));
//获取包含类名的文本节点
NodeList nl = doc.getElementsByTagName("className");
Node classNode = nl.item(0).getFirstChild();
String cName = classNode.getNodeValue();
//通过类名生成实例对象并将其返回
Class c = Class.forName(cName);
Object obj = c.newInstance();
return obj;
}catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
text.java
package software_proxy_3;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
public class shijian3_proxymode {
public static void main(String[] args) {
AbstractLog al;
//al = (AbstractLog)XMLUtil.getBean();
//al.method();
try {
Date date = new Date();
//format对象是用来以指定的时间格式格式化时间的
SimpleDateFormat from = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//format()方法是用来格式化时间的方法
String times = from.format(date);
System.out.println("方法method()被调用,调用时间为:" + times);
//用来产生除零异常来模拟method方法调用是否成功
Random random = new Random();
int a = random.nextInt(100);
int b = random.nextInt(10);
int c = a / b;
System.out.println("方法method()调用成功");
} catch (Exception e) {
System.out.println("方法method()调用失败");
}
}
}