java内存分析
类加载的过程
类加载器的作用
核心库:rt.jar包
获取类的运行时结构
package com.zhujieandfanshe;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
//获取运行时类的完整结构
public class Test12 {
public static void main(String[] args)throws Exception {
Class c1=Class.forName("com.zhujieandfanshe.User");
System.out.println("-----------------------------类名");
System.out.println(c1.getName());//包名+类名
System.out.println(c1.getSimpleName());//类名
Field[] f=c1.getFields();//只能输出public的属性
for(int i=0;i<f.length;i++){
System.out.println(f[i]);
}
System.out.println("-----------------------------属性");
f=c1.getDeclaredFields();//可以输出所有的属性
for(int i=0;i<f.length;i++){
System.out.println(f[i]);
}
System.out.println("获取指定属性"+c1.getDeclaredField("name"));
System.out.println("-----------------------------方法");
Method[] m=c1.getMethods();//只能输出public的方法
for(int i=0;i<m.length;i++){
System.out.println("包括父类的所有public方法"+m[i]);
}
m=c1.getDeclaredMethods();//可以输出所有的属性
for(int i=0;i<m.length;i++){
System.out.println("本类的所有方法"+m[i]);
}
System.out.println("获取指定方法"+c1.getMethod("getName",null));
System.out.println("-----------------------------构造器");
Constructor[] c=c1.getConstructors();//只能输出public的属性
for(Constructor constructor:c){
System.out.println("public+"+constructor);
}
c=c1.getDeclaredConstructors();//可以输出所有的属性
for(Constructor constructor:c){
System.out.println("本类的所有"+constructor);
}
System.out.println("获取指定"+c1.getConstructor(String.class,int.class));
}
}
动态创建对象执行方法
反射的使用
package com.zhujieandfanshe;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
//通过反射动态的创建对象,
public class Test13 {
public static void main(String[] args) throws Exception{
Class c1=Class.forName("com.zhujieandfanshe.User");
// System.out.println("-----------------------------通过反射创建对象----------------------");
// User user1=(User) c1.newInstance();
// System.out.println(user1);
// System.out.println("-----------------------------通过构造器创建对象----------------------");
// Constructor constructor=c1.getConstructor(String.class,int.class);
// User user2=(User) constructor.newInstance("老公",01);
// System.out.println(user2);
// System.out.println("-----------------------------通过反射调用普通的方法----------------------");
// User user3=(User) c1.newInstance();
// Method method=c1.getDeclaredMethod("setName",String.class);
// method.invoke(user3,"老公");
// System.out.println(user3.getName());
System.out.println("-----------------------------通过反射操作属性----------------------");
User user4=(User) c1.newInstance();
Field field=c1.getDeclaredField("name");
field.setAccessible(true);//关闭属性检测,因为私有属性无法打印
field.set(user4,"老公");
System.out.println(user4.getName());
}
}