1.获取Class对象的三种方式
//获取Class对象的三种方式
//1.通过实例对象获取
User user = new User();
Class aClass1 = user.getClass();
System.out.println(aClass1);
//2.直接获取class2
Class<User> aClass2 = User.class;
System.out.println(aClass2);
//3.通过路径加载类获取
Class<?> aClass3 = Class.forName("com.dxy.study_0628.domain.User");
System.out.println(aClass3);
2.获取所有公有构造方法
//4.获取所有公有构造方法
System.out.println("---获取所有公有构造方法---");
Constructor<?>[] constructors = aClass3.getConstructors();
for (Constructor constructor:constructors){
System.out.println(constructor);
}
package com.dxy.study_0628.study.reflect;
import com.dxy.study_0628.domain.User;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* 关于反射的使用
*/
public class fs_02 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {
//获取Class对象的三种方式
//1.通过实例对象获取
User user = new User();
Class aClass1 = user.getClass();
System.out.println(aClass1);
//2.直接获取class2
Class<User> aClass2 = User.class;
System.out.println(aClass2);
//3.通过路径加载类获取
Class<?> aClass3 = Class.forName("com.dxy.study_0628.domain.User");
System.out.println(aClass3);
//4.获取所有公有构造方法
System.out.println("---获取所有公有构造方法---");
Constructor<?>[] constructors = aClass3.getConstructors();
for (Constructor constructor:constructors){
System.out.println(constructor);
}
//5.所有的构造方法(包括:私有、受保护、默认、公有)
System.out.println("************所有的构造方法(包括:私有、受保护、默认、公有)***************");
Constructor<?>[] declaredConstructors = aClass3.getDeclaredConstructors();
for (Constructor constructor:declaredConstructors){
System.out.println(constructor);
}
//6.获取公有、无参的构造方法
System.out.println("*****************获取公有、无参的构造方法*******************************");
Constructor<?> constructor = aClass3.getConstructor(null);
System.out.println(constructor);
//实例对象
Object o = constructor.newInstance();
System.out.println(o);
//7.获取私有构造方法,并调用
System.out.println("******************获取私有构造方法,并调用*******************************");
Constructor<?> declaredConstructor = aClass3.getDeclaredConstructor(String.class);
System.out.println(declaredConstructor);
//调用构造方法
declaredConstructor.setAccessible(true);//暴力访问(忽略掉访问修饰符)
Object o1 = declaredConstructor.newInstance("123");
System.out.println(o1);
Constructor<?> declaredConstructor1 = aClass3.getDeclaredConstructor(String.class, String.class);
System.out.println(declaredConstructor1);
declaredConstructor1.setAccessible(true);
Object abc = declaredConstructor1.newInstance("abc", "123");
System.out.println(abc);
//8.获取所有公有的字段
System.out.println("************获取所有公有的字段********************");
Field[] fields = aClass3.getFields();
for (Field field:fields){
System.out.println(field);
}
System.out.println("************获取所有的字段(包括私有、受保护、默认的)********************");
Field[] declaredFields = aClass3.getDeclaredFields();
for (Field field:declaredFields){
System.out.println(field);
}
System.out.println("*************获取公有字段**并调用***********************************");
Field gy = aClass3.getField("gy");
System.out.println(gy);
Object o2 = aClass3.getConstructor().newInstance();
gy.set(o2,"gonygou43");
System.out.println(o2);
//9.获取私有字段****并调用
System.out.println("**************获取私有字段****并调用********************************");
Field id = aClass3.getDeclaredField("id");
id.setAccessible(true);//暴力反射,解除私有限定
Object o3 = aClass3.getConstructor().newInstance();
id.set(o3,5);
Field username = aClass3.getDeclaredField("username");
username.setAccessible(true);//暴力反射,解除私有限定
username.set(o3,"tov");
System.out.println(o3);
//10.获取所有公有方法
System.out.println("***************获取所有的”公有“方法*******************");
Method[] methods = aClass3.getMethods();
for (Method method:methods){
//包括了所有的公有方法
System.out.println(method);
}
//11.获取所有的方法,包括私有的
System.out.println("***************获取所有的方法,包括私有的*******************");
Method[] declaredMethods = aClass3.getDeclaredMethods();
for (Method method:declaredMethods){
System.out.println(method);
}
System.out.println("***************获取公有的setPassword()方法*******************");
Method getPassword = aClass3.getMethod("setPassword", String.class);
System.out.println(getPassword);
Object o4 = aClass3.getConstructor().newInstance();
getPassword.invoke(o4,"刘德华");
System.out.println(o4);
System.out.println("***************获取私有的show()方法******************");
Method show = aClass3.getDeclaredMethod("show", String.class);
System.out.println(show);
show.setAccessible(true);//解除私有限定
Object invoke = show.invoke(o4, "555");
System.out.println(o4+"---"+invoke);
}
}
调用main方法
package com.dxy.study_0628.study.reflect;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* 通过反射调用main方法
*/
public class fs_03 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
//1、获取Student对象的字节码
Class clazz = Class.forName("com.dxy.study_0628.study.reflect.fs_02");
Method main = clazz.getMethod("main", String[].class);
// main.invoke(null, new Object[]{new String[]{"a","b","c"}});
main.invoke(null,(Object)new String[]{
"a","b","c"});
}
}
https://blog.csdn.net/sinat_38259539/article/details/71799078