- 获得类对象的三种方法(一切反射相关的代码都从获得类对象开始)
1.1 Class.forName(完整类名)
// Class<?> c = Class.forName("test.Student");
// Constructor<?> cs = c.getConstructor();
// cs.newInstance();
1.2 类名.class
// Student s = Student.class.newInstance();
1.3 对象.getClass()
// Student s=new Student();
// Class<? extends Student> class1 = s.getClass();
注1:ClassNotFoundException(类名错|少jar包)
注2:同一类的、类对象只会创建一个
2。反射的作用,都调用类中的私有化的属性的和法
示例
2.1先创建一个Student类
package test;
public class Student {
private String sid;
private String sname;
public Integer age;
public Student() {
super();
System.out.println("调用无参构造方法创建了一个学生对象");
}
public Student(String sid) {
super();
this.sid = sid;
System.out.println("调用带一个参数的构造方法创建了一个学生对象");
}
public Student(String sid, String sname) {
super();
this.sid = sid;
this.sname = sname;
System.out.println("调用带二个参数的构造方法创建了一个学生对象");
}
@SuppressWarnings("unused")
private Student(Integer age) {
System.out.println("调用Student类私有的构造方法创建一个学生对象");
this.age = age;
}
public String getSid() {
return sid;
}
public void setSid(String sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public void hello() {
System.out.println("你好!我是" + this.sname);
}
public void hello(String name) {
System.out.println(name + "你好!我是" + this.sname);
}
@SuppressWarnings("unused")
private Integer add(Integer a, Integer b) {
return new Integer(a.intValue() + b.intValue());
}
}
2.2调用Student类中的私有化属性和方法
public static void main(String[] args) {
try {
// Class<?> c = Class.forName("test.Student");
// Constructor<?> cs = c.getDeclaredConstructor(Integer.class);
// cs.setAccessible(true);
// Object obj = cs.newInstance(17);
// Class<?> c = Class.forName("test.Student");
// Object obj = c.newInstance();
// Field f = c.getDeclaredField("sid");
// f.setAccessible(true);
// System.out.println(f.get(obj));
// Class<?> c = Class.forName("test.Student");
// Object obj = c.newInstance();
// Method m = c.getMethod("hello");
// m.invoke(obj);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
注意在调用私有化的属性和方法是需要授权(
filed.setAccessible(true);)
示例
// Class<?> c = Class.forName("test.Student");
// Field f = c.getDeclaredField("sid");
// f.setAccessible(true);
// System.out.println(f.get(obj));