/*知识点:
* java中每个类型<基本数据类型和引用类型,如int.class>都有class属性
* Class 类
* 成员变量 Filed
* 构造方法 Constructor
* 成员方法 Method
* 把Class类里面的东西 又重新抽象出来 这三个类 然后得到这三个类的对象 去调用方法 这叫反射
* 3种方法
* 1、Class c1=类名.Class;---注意:此的静态语句块不会执行,c2的会执行(记着就行,我也不知道为哈)
* 2、Class c2=Class.forName("类全名且有包名");(推荐)
* 3、Class c3=引用.getClass;
public class Student {
private String name;
private int age;
public Student() {
System.out.println("无参构造方法");
}
public Student(String name, int age) {
System.out.println("反射了" + name +age+ "的有参构造方法" );
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void methodTest(){
System.out.println("反射了无参的方法");
}
public void methodTest1(String arg,int arg1){
System.out.println("反射了有参的方法"+arg+arg1);
}
public void methodTest2(String arg,int[] arg1){
System.out.println("反射了有参的方法"+arg+arg1[2]);
}
public boolean login(String name,String pwd) {
if("admin".equals(name) && "123".equals(pwd) ) {
return true;
}
return false;
}
public void logout() {
System.out.println("logout");
}
}
++++++++++++++++++++++++++++++
public class Test01 {
public static void main(String[] args) throws Exception{
// 获取类
Class c = Class.forName("com.huashen.reflect.Student");
// 获取特定的属性(因为属性可以用属性名来区别,而获取用这个不行,因为方法有重载,所以后面得跟个可变参数)
Field namef = c.getDeclaredField("name");
Field agef = c.getDeclaredField("age");
// 创建对象
Object o = c.newInstance();
// 打破封装-导致数据不安全,另一个缺点是,性能降低
namef.setAccessible(true);
agef.setAccessible(true);
// 设置属性值
namef.set(o, "倪申平");
agef.set(o, 18);
System.out.println(namef.get(o));
System.out.println(agef.get(o));
System.out.println("================================");
//获取特定的方法,因为方法有重载,所以后面得跟个可变参数
Method m=c.getDeclaredMethod("login", String.class,String.class);
Object value=m.invoke(o, "admin","123");
System.out.println(value);
System.out.println("++++++++++++++++++++++");
//获取特定的constructor
Constructor con=c.getDeclaredConstructor(String.class,int.class);
Object object=con.newInstance("倪申平",23);
// 注意,c.newInstance调用的无参构造,而con.newInstance调用的有参构造
// System.out.println(object);
}
}