实例
示例一
ReflectDemo.java
- 创建一个properties文件,把他加载进入类。
package com.gl.reflect;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;
public class ReflectDemo {
public static void main(String[] args) throws IOException, NoSuchMethodException, ClassNotFoundException, IllegalAccessException, InstantiationException, InvocationTargetException {
Properties pro=new Properties();
Class reflectDemoClass = ReflectDemo.class;
InputStream resourceAsStream = reflectDemoClass.getClassLoader().getResourceAsStream("pro.properties");
if(resourceAsStream==null) System.out.println("文件找不到");
System.out.println(System.getProperty("user.dir"));
pro.load(resourceAsStream);
String methodName = pro.getProperty("methodName");
String source2 = pro.getProperty("source");
Class<?> source1 = Class.forName(source2);
Object o = source1.newInstance();
Method method = source1.getMethod(methodName);
method.invoke(o);
}
}
示例二
Reflect.java
package com.gl.annotation;
import java.lang.annotation.Annotation;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
@Pro(className = "com.gl.domain.Person",methodName = "eat")
public class Reflect {
public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException, ClassNotFoundException {
Class reflectClass = Reflect.class;
Pro pro = (Pro) reflectClass.getAnnotation(Pro.class);
String s = pro.methodName();
System.out.println(s);
String s1 = pro.className();
System.out.println(s1);
Class<?> aClass1 = Class.forName(s1);
Object o = aClass1.newInstance();
Method eat = aClass1.getMethod(s);
eat.invoke(o);
}
}
}
}
Pro.java
package com.gl.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(value = ElementType.TYPE)
@Retention(value = RetentionPolicy.RUNTIME)
public @interface Pro {
String methodName();
String className();
}
示例三
Calculator.java
package com.gl.reflect;
public class Calculator {
@Check()
public void add(){
System.out.println(100/0);
System.out.println("1+1="+1+1);
}
@Check()
public void sub(){
System.out.println("1-1="+(1+1));
}
@Check
public void multiply(){
System.out.println("1*1="+1*1);
}
@Check
public void chu(){
System.out.println("1/1="+(1/0));
}
public void check(){
System.out.println("代码完美,没有bug");
}
}
Check.java
package com.gl.reflect;
public class Calculator {
@Check()
public void add(){
System.out.println(100/0);
System.out.println("1+1="+1+1);
}
@Check()
public void sub(){
System.out.println("1-1="+(1+1));
}
@Check
public void multiply(){
System.out.println("1*1="+1*1);
}
@Check
public void chu(){
System.out.println("1/1="+(1/0));
}
public void check(){
System.out.println("代码完美,没有bug");
}
}
Demo.java
package com.gl.reflect;
import java.io.*;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Demo {
public static void main(String[] args) throws IOException {
Calculator calculator = new Calculator();
Class aClass1 = calculator.getClass();
Method[] methods = aClass1.getMethods();
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("b.txt"));
int num = 0;
for (Method method : methods) {
if (method.isAnnotationPresent(Check.class)) {
try {
method.invoke(calculator);
} catch (Exception e) {
num++;
bufferedWriter.write(method.getName() + "发生了异常");
bufferedWriter.newLine();
bufferedWriter.write("异常的原因是" + e.getCause().getMessage());
bufferedWriter.newLine();
}
}
}
bufferedWriter.write("发生了" + num + "次异常");
bufferedWriter.flush();
bufferedWriter.close();
}
}