类加载器
类加载器:3种
引导类加载器:BootStrap
扩展类加载器:ExtClassLoader
应用类加载器:AppClassLoader
引导类加载器:加载JRE/lib/rt.jar - 最基础的文件
扩展类加载器:JRE/lib/ext/*.jar - 加载都是基础的文件
应用类加载器:三方jar包和自己编写java文件
类加载的方式:
1.使用的时候
2.XX.class
3.Class.forName(“java.lang.String”);
每一个类加载,都会得到一个它对应的Class对象
操作字节码对象 ->反射 Class
反射
Class cls=User.class;
//getConstructor,只能获得公开的构造器
Constructor constructor = cls.getConstructor(Integer.class,String.class);//获得了参数为int,String的构造器
//Constructor constructor2=cls.getConstructor();//类中此无参构造器是私有的无法访问
User user1 = (User) constructor.newInstance(1001,"张三");//调用获得的构造器,获得对象
System.out.println(user1);//
cla.newInstance();//默认使用可以被访问的无参构造器创建对象
类中所有的成员[属性、方法、父类、接口、异常…]
都可以通过字节码对象获得
声明过的、公开的
私有的
私有化的构造器初始化的内容是不可见的,可以通过setAccessable为true
构造器:getConstructor();-不传参数调用无参构造器,传参数时传字节码对象int.class…
在反射理论中,基本数据类型和其包装类型完全不一样
public void test02() throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
Class cls = User.class;
//可以获得所有的构造器,包括私有的
Constructor constructor = cls.getDeclaredConstructor();
//私有化构造器默认不可见,设置可见
constructor.setAccessible(true);
User user = (User) constructor.newInstance();
System.out.println(user);
}
public void test03() throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
Class cls = User.class;
Constructor constructor = cls.getConstructor(String.class,String.class);//获得构造器
User u = (User) constructor.newInstance("lucy","f");
//getMethod("方法名",方法参数的类对象)
Method method = cls.getMethod("sex");//获得方法
Object invoke = method.invoke(u);//方法没有返回值的华,invoke返回null
System.out.println(invoke);
工厂模式
工厂模式:提供方法,为了获得对应的对象
将需要的类名存在配置文件中,通过配置文件读取,降低代码耦合性
public class FactoryUtils {
private static Properties pros;
static {
pros = new Properties();
try {
pros.load(new FileInputStream(FactoryUtils.class.getResource("factory.properties").getFile()));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static Object getInstance(String classKey) {
// 1.通过key,获得对应的类名
String className = pros.getProperty(classKey);
// 2.获得对应的Class对象
try {
Class<?> clz = Class.forName(className);
// 3.创建对象,并返回
return clz.newInstance();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
}