1.错误的类
package Test3;
public class demo1 {
@yichang
public int jia(){
int b=64232942;
int c=321121213;
b=c+b;
return b;
}
@yichang
public String z(){
String name=null;
return name;
}
@yichang
public void ff(){
System.out.println("1/0"+(1/0));
}
@yichang
public void ffc(){
System.out.println("1/0"+(3/0));
}
@yichang
public void ffz(){
System.out.println("1/0"+(2/0));
}
}
注解
package Test3;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface yichang {
}
测试
package Test3;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class demo3 {
public static void main(String[] args) throws IllegalAccessException, InstantiationException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException {
demo1 demo = new demo1();
// Class<demo1> demo1Class = demo1.class;
Class<?> demo1Class= Class.forName("Test3.demo1");
//返回此类的对象并返回其全部方法
System.out.println("class" + demo1Class);
Method[] methods = demo1Class.getMethods();
int bug = 0;
for (Method a : methods) {
if (a.isAnnotationPresent(yichang.class)) {
//判断这个方法是否有注解
try {
Object invoke = a.invoke(demo);
System.out.println(a.getName() + "方法执行成功,结果为:" + invoke);
System.out.println("--------------------");
} catch (Exception e) {
// e.printStackTrace();
bug++;
System.out.println(a.getName() + "的方法出现了异常");
System.out.println("异常出现了" + bug + "次");
System.out.println("异常的原因是" + e.getMessage());
System.out.println("异常名称是:" + e.getCause().getClass().getSimpleName());
System.out.println("--------------------");
}
}
}
//
// /**
// * demo1.class 是解析demo1的字节码,根据newInstance()方法可以
// * 生成demo1 的对象 也就是解析类的对象 并由对象调用其方法
// *
// * 而Class.forName("Test3.demo1");调用其newInstance()方法
// * 返回的是object的对象
// *
// * Class.forName是反射机制的一种,用于在知道类名及其路径的
// * 情况下获取这个类,而XXX.class 一般用于获得类型
// *
// * Class.forName("XXXX");
// * 的作用是要求JVM查找并加载指定的类
// * ,zhi如果在类中有静态初始化的话,
// * JVM必然会执行该类的静态代码段,这时是不确定该类是否已经在JVM中加载。
// * 而XXXX.class是在JVM中加载已经加载过的类。
// *
// * Class<demo1> Class<?>
// */
//
// Class<demo1> demo1Class1 = demo1.class;
// System.out.println(demo1Class1);
// demo1 demo1 = demo1Class1.newInstance();
int jia = demo1.jia();
System.out.println(jia);
// Method jia2 = demo1Class.getMethod("jia");
// Object invoke2 = jia2.invoke(demo1);
// System.out.println(invoke2);
// System.out.println("---------------");
//
// Class<?> aClass = Class.forName("Test3.demo1");
// System.out.println(aClass);
// Object o = aClass.newInstance();
// Method jia1 = aClass.getMethod("jia");
// Object invoke = jia1.invoke(o);
// System.out.println(invoke);
//
//
Class<demo1> demo1Class1 = demo1.class;
System.out.println(demo1Class1);
Class<? extends Class> aClass = demo1Class1.getClass();
System.out.println(aClass);
// /**
// * .getClass()是一个对象实例的方法,
// * 只有对象实例才有这个方法,
// * 具体的类是没有的。类的Class类实例是通过.class获得的,
// * 显然,类没有.getClass()方法.
// * class Test3.demo1 System.out.println(demo1Class1);
// * class java.lang.Class System.out.println(aClass);
// * getClass方法,有多态能力,运行时可以返回子类的类型信息,
// * .class是没有多态的,是静态解析的,编译时可以确定类型信息
// */
Class<?> aClass1 = Class.forName(yichang);
}
}