类的执行过程
类加载步骤
什么是反射
反射api
Class
//1.通过Class.forName()(对于编译器并不知道对象类型,在运行期对未知类型进行操作时)
try {
Class c=Class.forName("preview.Person");
System.out.println(c.getName());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//2.通过对象实例的getClass()方法
Person p=new Person();
Class c2=p.getClass();
System.out.println(c2.getName());
//3.通过类的class属性获取
Class c3=Person.class;
System.out.println(c3.getName());
基于反射获取类信息
基于反射生成类的实例
Constructor constructor = c.getConstructor(new Class[]{int.class,String.class,String.class});
Object o = constructor.newInstance(new Object[]{18,"战三","朝阳"});
Method method=c.getMethod("show",null);
method.invoke(o,null);
反射实现应用
public class test {
public void promote(String id,String className){
try {
//获得相应类的Class对象
Class c=Class.forName(className);
//根据Class获取构造方法
Constructor constructor = c.getConstructor();
//根据构造方法对象实例化
Object o = constructor.newInstance();
//调用相应的对象的商品打折方法
Method method = c.getMethod("promote", String.class);
double d= (double) method.invoke(o,id);
System.out.println(d);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
test t=new test();
t.promote("01","preview.work.Children");
}
}
反射获取类对象的三种方式:
- 1.类型.class
Class<Student> stu = Student.class;
- 2.Class.forName(“类型的全路径名”)
Class<?> ss = Class.forName("demo.Student");//第三种
- 3.对象.getClass()
TestStudent s=new TestStudent();
//获取类对象的另一种方法
// Class<? extends TestStudent> aClass = s.getClass();