反射创建对象:
public class User {
private String name="小明";
private int age=10;
//无参构造器
public User(){
}
public User(String name){
this.name=name;
}
//受保护的构造器:
private User(String name,int age){
this.name=name;
this.age=age;
}
@Override
public String toString() {
return "User=[" +
"name='" + name + '\'' +
", age=" + age +
']';
}
}
public class reflect_class {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
String classpath="com.hsp.User";
Class<?> cls = Class.forName(classpath);
//public的无参构造器;
Object obj1 = cls.newInstance();
System.out.println("public的无参构造器:"+obj1);
//public的有参构造器:先使用构造器:
Constructor<?> constructor = cls.getConstructor(String.class);
Object obj2 = constructor.newInstance("shanxi");
System.out.println("public的有参构造器:"+obj2);
//prvate的有参构造器:
Constructor<?> declaredConstructor = cls.getDeclaredConstructor(String.class,int.class);//需要传入对应参数的class
//对于私有的构造器:可以设置暴力破解的方式:
declaredConstructor.setAccessible(true);
Object obj3 = declaredConstructor.newInstance("小明", 18);
System.out.println("private的有参构造器:"+obj3);
}
}
public的无参构造器:User=[name='null', age=0]
public的有参构造器:User=[name='shanxi', age=0]
private的有参构造器:User=[name='小明', age=18]
通过反射访问属性:
public class Student {
private String name;
public int age;
public Student(){
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class reflect_filed {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchFieldException {
String classpth="com.hsp.Student";
Class<?> cls = Class.forName(classpth);
//访问public的name属性: 无参构造器:
Object o = cls.newInstance();
System.out.println("o的运行类型是:"+o.getClass());
//getField 只可以得到public修饰的属性:
Field age = cls.getField("age");
//设置属性的值:
age.set(o,18);
//属性名.get(对象名)
System.out.println(age.get(o));
//使用反射的方式得到private的属性; getDeclaredField是可以得到private修饰的属性;
Field name = cls.getDeclaredField("name");
name.setAccessible(true);//暴力破解;
name.set(o,"小花");
System.out.println(name.get(o));
}
}
o的运行类型是:class com.hsp.Student
18
小花
使用反射调用方法:
public class Monster {
}
public class Boss {
public int age;
private static String name;
//无参构造器
public Boss(){
}
//public的普通方法:
public void hi(String s){
System.out.println("hi" +s);
}
public Monster m1(){
return new Monster();
}
//静态方法:
public static String say(int n,String s,char c){
return n +","+ s +"," +c;
}
}
public class reflect_method {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
String classpath="com.hsp.Boss";
//找到Class类
Class<?> cls = Class.forName(classpath);
//无参构造器;实例化一个对象
Object o = cls.newInstance();
System.out.println("o的运行类型是:"+o);
//调用public的hi方法: String.class是参数的类型
Method hi= cls.getMethod("hi", String.class);
hi.invoke(o,"你好"); //方法名.invoke(对象,参数)
//调用private static方法: getDeclaredMethod可以调用被private修饰的方法
Method say = cls.getDeclaredMethod("say", int.class, String.class, char.class);
//先暴力破解:
say.setAccessible(true);
//say.invoke(o,18,"小天",'男');
//使用static修饰的也可以用用null 来表示;
Object obj = say.invoke(null, 18, "小天", '男');
System.out.println("obj的运行类型是:"+obj.getClass());//因为返回值是String
System.out.println(say.invoke(null,18,"小天",'男'));
//m1 使用方法返回一个对象;
Method m1= cls.getMethod("m1");
Object Monster = m1.invoke(o); //对应
//返回值是 Monster
System.out.println("Monster的运行类型是:"+Monster.getClass());
}
}
o的运行类型是:com.hsp.Boss@677327b6
hi你好
obj的运行类型是:class java.lang.String
18,小天,男
Monster的运行类型是:class com.hsp.Monster