反射的基本原理
1.通过反射来获取类
Class<User> user = User.class;
Class<?> user1 = Class.forName("com.scce.test.User");
System.out.println(user);
通过反射来获取类的方式总共有三种在我这里只写了两种,其效果和
User user = new User();
的效果是一样的。
运行的效果是:com.scce.test.User
其次我们来判断这两个对象是否为同一个对象
System.out.println(user==user1);
运行的结果为:true
则这两个对象为同一个对象
2.通过反射来获取构造方法
class3.getConstructor(String.class,int.class);
//这个参数表示构造器的class构造器
//只能获取公共的构造器
//构造方法
//构造器中传入参数的class的构造器
//如果想要获取私有的方法
Constructor<?> a = class3.getDeclaredConstructor(String.class,int.class);
这里要讲的是方法里面传入的参数要为字节码
所以传入的参数要写成
String.class括号里面的内容要和参数列表里面的类型要匹配
class3为对象的字节码.getConstructor()
3.调用所有的构造方法
Constructor<?>[] methods = class3.getConstructors();
for(Constructor me:methods){
System.out.println(me);
}
4.调用私有的构造方法
Method method3 = user.getDeclaredMethod("method3",String.class);
//调用私有的方法的时候应该设置该方法的访问权限
method3.setAccessible(true);
//获取当前类的对象
//Field[] fields = user.getFields();
//获取私有的方法
Field[] fields = user.getDeclaredFields();
5.调用普通方法
Object obj = user.newInstance();//底层的私有属性对象
//访问公共的方法
Method method1= user.getMethod("method2",String.class);
//invoke是执行的意思
String a = (String) method1.invoke(obj, "123");
System.out.println(a);
Method method3 = user.getDeclaredMethod("method3",String.class);
//调用私有的方法的时候应该设置该方法的访问权限
method3.setAccessible(true);
//获取当前类的对象
//Field[] fields = user.getFields();
//获取私有的方法
Field[] fields = user.getDeclaredFields();
全部的代码:
public class Demo {
public static void main(String[] args) throws Exception {
//反射获取类
Class<User> user = User.class;
Class<?> user1 = Class.forName("com.scce.test.User");
System.out.println(user);
System.out.println(user==user1);
System.out.println("=============");
Object obj = user.newInstance();//底层的私有属性对象
//访问公共的方法
Method method1= user.getMethod("method2",String.class);
//invoke是执行的意思
String a = (String) method1.invoke(obj, "123");
System.out.println(a);
Method method3 = user.getDeclaredMethod("method3",String.class);
//调用私有的方法的时候应该设置该方法的访问权限
method3.setAccessible(true);
//获取当前类的对象
//Field[] fields = user.getFields();
//获取私有的方法
Field[] fields = user.getDeclaredFields();
System.out.println("-----------------------------------------");
for(Field field:fields){
System.out.println(field);
}
Field field = user.getDeclaredField("id");
//对属性添加get和set方法
Field field1 = user.getDeclaredField("name");
field1.setAccessible(true);
System.out.println("-------------------------");
System.out.println("name"+field1);
Object obj1 = user.newInstance();
field1.set(obj1, "ad");
System.out.println("----------------------");
field1.get(obj1);
System.out.println( field1.get(obj1));
//单例设计模式:
//在整个应用程序中某一个类的对象,有且只有一个对象
//懒汉模式、枚举
}
public static <T>T createInstance(String className,Class<T> cls){
try {
Class<T> clz= (Class<T>)Class.forName(className);
Object obj = clz.newInstance();
return (T) obj;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}