失败,是正因你在距成功一步之遥的时候停住了脚步。
1、镜中的自己
public class Demo {
public static void main(String[] args){
// 类对象就是类的模板,可以获取类的一切信息
// 类对象(Java编译的字节码文件,JVM加载成一个对象)
User user = new User();
Class<? extends User> aClass = user.getClass();
}
}
class User {
}
2、字节码
public class Demo {
public static void main(String[] args) throws Exception {
Child child = new Child();
// 类对象(Java编译的字节码文件,JVM加载成一个对象)
Class<? extends Child> aClass = child.getClass();
// 获取类的名称
System.out.println(aClass.getName()); //获取包名+类名
System.out.println(aClass.getSimpleName()); //获取类名
//System.out.println(aClass.getPackageName()); //获取包名
// 获取父类
System.out.println(aClass.getSuperclass());
// 获取类的接口
System.out.println(aClass.getInterfaces().length);
// 获取属性
Field xxx = aClass.getField("name"); // 权限public
Field xxx1 = aClass.getDeclaredField("name"); // 所有权限
Field[] fields = aClass.getFields(); // 所有权限public
Field[] fields1 = aClass.getDeclaredFields(); // 所有权限
// 获取方法
Method test2 = aClass.getMethod("test2"); // 权限public
Method test21 = aClass.getDeclaredMethod("test2"); // 所有权限
Method[] methods = aClass.getMethods(); // 权限public
Method[] methods1 = aClass.getDeclaredMethods(); // 所有权限
// 获取构造函数
Constructor<? extends Child> constructor = aClass.getConstructor();
Constructor<?>[] constructors = aClass.getConstructors();
Constructor<? extends Child> constructor1 = aClass.getDeclaredConstructor();
// 获取权限(修饰符)
int modifiers = aClass.getModifiers();
System.out.println(Modifier.isProtected(modifiers));
System.out.println(Modifier.isPrivate(modifiers));
System.out.println(Modifier.isPublic(modifiers));
System.out.println(Modifier.isTransient(modifiers));
System.out.println(Modifier.isFinal(modifiers));
System.out.println(Modifier.isAbstract(modifiers));
System.out.println(Modifier.isInterface(modifiers));
System.out.println(Modifier.isNative(modifiers));
System.out.println(Modifier.isStatic(modifiers));
System.out.println(Modifier.isStrict(modifiers));
System.out.println(Modifier.isSynchronized(modifiers));
System.out.println(Modifier.isVolatile(modifiers));
System.out.println(modifiers);
System.out.println(Modifier.toString(modifiers));
}
}
class User {
public User() {
}
public void test1() {
System.out.println("test1...");
}
}
class Child extends User {
public String name;
public Child() {
}
public void test2() {
System.out.println("test2...");
}
}
3、类加载器
public class Demo {
public static void main(String[] args) {
// 加载类
// Java中的类主要分为3种:
// 1.Java核心类库中的类:String、Object
// 2.JVM软件平台开发商
// 3.自己写的类:User、Child
// 类加载器也有3种
// 1.BootClassLoader:启动类加载器(加载类时,采用操作系统平台语言实现)
// 2.PlatformClassLoader:平台类加载器
// 3.AppClassLoader:应用类加载器
// 获取类的信息
Class<Student> student = Student.class;
// 获取类的加载器对象
ClassLoader classLoader = student.getClassLoader();
// 打印 AppClassLoader应用类加载器
System.out.println(classLoader);
// 打印 AppClassLoader的加载器 PlatformClassLoader平台类加载器
System.out.println(classLoader.getParent());
// 打印 PlatformClassLoader平台类加载器 的加载器
System.out.println(classLoader.getParent().getParent());
// 加载 Java核心类库 > 平台类库 > 自己类
}
}
class Student{
}
4、练习
public class Demo {
public static void main(String[] args) throws Exception {
// 反射练习
// 获取class对象
Class<Emp> empClass = Emp.class;
// 获取构造方法
Constructor<Emp> constructor = empClass.getDeclaredConstructor();
// 创建类
Emp emp = constructor.newInstance();
// 获取属性
Field account = empClass.getField("account");
Field password = empClass.getField("password");
// 属性赋值
account.set(emp,"admin");
password.set(emp,"admin");
// 获取方法
Method login = empClass.getMethod("login");
// 执行方法
Object result = login.invoke(emp);
// 执行结果
System.out.println(result);
}
}
class Emp{
public String account;
public String password;
public boolean login(){
if ("admin".equals(account) || "admin".equals(password)){
return true;
}else{
return false;
}
}
}
5、常见异常
// 反射常见异常
// 1.ClassNotFoundException 类找不到异常
// 2.NoSuchMethodException 方法找不到异常
// 3.NoSuchFieldException 属性找不到异常
// 4.IllegalArgumentException 参数异常
// 5.IllegalAccessException 访问权限异常
// 6.InvocationTargetException 调用目标异常