反射
1.反射概念
反射:指在程序运行过程中,动态的获取类信息,并且可以访问这些信息。
2.获取构造器
获取构造方法
代码演示
package com.qfedu.test2;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
/**
* 通过反射获取到一个构造器对象
* 通过构造器对象创建一个本类对象
* getConstructor 可以获取到public修饰的构造方法 不能获取到私有的 获取其他的修饰的构造方法
* @author WHD
*
*/
public class Test1 {
public static void main(String[] args) {
try {
Class<?> stuClass = Class.forName("com.qfedu.test2.Student");
Constructor<?> stuConstructor = stuClass.getConstructor(String.class,int.class);
Constructor<?> constructor = stuClass.getConstructor();
Object newInstance = stuConstructor.newInstance("赵四",17);
Student stu = (Student) newInstance;
System.out.println(stu.getName() + stu.getAge());
Constructor<?>[] constructors = stuClass.getConstructors();
for(Constructor cons : constructors) {
System.out.println(cons.getName());
System.out.println(cons.getParameterCount());
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class Student{
private String name;
private int 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 Student(String name, int age) {
this.name = name;
this.age = age;
}
public Student() {
}
}
package com.qfedu.test1;
import java.lang.reflect.Constructor;
/**
* 使用反射获取private修饰的 默认修饰的 protected public修饰的构造方法
* getConstructors() public修饰的
* getConstructor() 获取单个public修饰的
* getDeclaredConstructors(); 获取所有的已定义的构造方法
* getDeclaredConstructor(); 获取单个已定义的构造方法
* @author WHD
*
*/
public class Test1 {
public static void main(String[] args) throws Exception {
Class<?> stuClass = Class.forName("com.qfedu.test1.Student");
// Constructor<?>[] cons = stuClass.getConstructors();
// Constructor<?>[] cons1 = stuClass.getDeclaredConstructors();
// System.out.println(cons.length);
// System.out.println(cons1.length);
Constructor<?> cons2 = stuClass.getDeclaredConstructor();
System.out.println(cons2);
cons2.setAccessible(true); // 忽略jvm的安全检查 使得我们可以访问私有修饰的构造方法
Object newInstance = cons2.newInstance();
System.out.println(newInstance);
}
}
class Student{
private String name;
private int 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;
}
Student(String name) {
this.name = name;
}
public Student( int age) {
this.age = age;
}
protected Student(String name, int age) {
this.name = name;
this.age = age;
}
private Student() {
System.out.println("私有的无参构造");
}
}
2.获取属性
代码演示
package com.qfedu.test2;
import java.lang.reflect.Field;
/**
* 获取public修饰的属性
* getFileds() 获取所有的public修饰的属性
* 属性的方法
* getFields() 获取public修饰的属性
* getField() 获取单个public修饰的属性
* getDeclaredFields() 获取所有的
* getDeclaredField() 获取单个的属性
* @author WHD
*
*/
public class Test2 {
public static void main(String[] args) throws Exception {
Class<?> personClass = Class.forName("com.qfedu.test2.Person");
Field[] fields = personClass.getFields();
for(Field f : fields) {
System.out.println(f.getName() );
System.out.println(f.getType());
}
Object newInstance = personClass.newInstance();
Field nameField = personClass.getField("name");
nameField.set(newInstance, "赵四");
System.out.println(nameField.get(newInstance));
}
}
class Person{
public String name;
public int age;
protected String address;
}
3.获取方法
代码演示
package com.qfedu.test2;
import java.lang.reflect.Method;
/**
* 获取所有公开的方法
* getMethods() 获取所有public修饰的 和 继承自父类方法
* @author WHD
*
*/
public class Test3 {
public static void main(String[] args) throws Exception {
Class<?> carClass = Class.forName("com.qfedu.test2.Car");
Method[] methods = carClass.getMethods();
for(Method m : methods) {
System.out.println(m.getName());
}
Object newInstance = carClass.newInstance();
Method method = carClass.getMethod("m1");
method.invoke(newInstance);
Method method2 = carClass.getMethod("m1",int.class);
method2.invoke(newInstance, 20);
}
}
class Car{
public void m1() {
System.out.println("Car类的m1方法");
}
public void m1(int a) {
System.out.println("Car类的有参数的m1方法" + a);
}
public void m1(double a) {
}
public void m2() {
System.out.println("Car类的m2方法");
}
}
package com.qfedu.test1;
import java.lang.reflect.Method;
/**
* 获取方法
* getMethods() 获取所有public 修饰的 和继承自父类 的方法
* getMethod() 获取单个 public修饰的或者继承自父类 的方法
* getDeclaredMethods() 获取已定义的所有的方法
* getDeclaredMethod() 获取单个已定义的方法
* @author WHD
*
*/
public class Test2 {
public static void main(String[] args) throws Exception {
Class<?> stuClass = Class.forName("com.qfedu.test1.Student1");
// Method[] methods = stuClass.getMethods();
// System.out.println(methods.length);
// for (Method method : methods) {
// System.out.println(method.getName());
// }
// Method[] declaredMethods = stuClass.getDeclaredMethods(); 获取所有已定义 4个
// System.out.println(declaredMethods.length);
Object newInstance = stuClass.newInstance();
Method m = stuClass.getDeclaredMethod("m2");
m.setAccessible(true);
m.invoke(newInstance);
Method m1 = stuClass.getDeclaredMethod("m2", int.class);
m1.setAccessible(true);
m1.invoke(newInstance, 20);
}
}
class Student1{
void m1() {
System.out.println("默认修饰的方法m1");
}
private void m2() {
System.out.println("私有修饰的方法m2");
}
private void m2(int a) {
System.out.println("私有修饰的方法m2" + a);
}
protected void m3() {
System.out.println("protected修饰的方法m3");
}
public void m4() {
System.out.println("public修饰的方法m4");
}
}