// 方式1
//Person P = new Person() ;
// Class C = p.getclass() ;
//方式2 Class c3 =Person. class ;
//方式3 C Class c4 = Class. forName ();
package reflect_study_01;
// 方式1
//Person P = new Person() ;
// Class C = p.getclass() ;
//方式2 Class c3 =Person. class ;
//方式3 C Class c4 = Class. forName ("cn.itcast 01.Person"T ;
public class ReflectDemo {
public static void main(String[] args) throws ClassNotFoundException {
// 方式1
Person p1=new Person();
Class c1=p1.getClass();
Person p2 = new Person();
Class c2 =p2.getClass();
System.out.println(p1==p2);
System.out.println(c1==c2); // true 证明class文件用的是同一个
//方式2
Class c3 =Person.class;
System.out.println(c1==c3);// true 证明class文件用的是同一个
//方式3
Class c4 =Class.forName("reflect_study_01.Person");//要把路径写清楚
System.out.println(c4==c1);
}
}
这里是创造Class文件对象并且使用他的构造方法:
//步骤 1创造一个Class对象指向class文件
// 2获取构造方法对象
// 3创造对象指向构造方法对象
//public Constructor[] getConstructors() :所有公共构造方法
//public Constructor[] getDeclaredConstructors () :所有构造方法
//获取单个构造方法
//public Constructor getConstructor (C1ass<?>… parameterTypes)
// 参数表示的是:你要获取的构造方法的构造参数个数及数据类型的clas s字节码文件对象
//public T newInstance (object. … initargs)
// 使用此Constructor对象表示的构造方法来创建该构造方法的声 明类的新实例,并用指定的初始化参数初始化该实例。
package reflect_study_02;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
//步骤 1创造一个Class对象指向class文件
// 2获取构造方法对象
// 3创造对象指向构造方法对象
//public Constructor[] getConstructors() :所有公共构造方法
//public Constructor[] getDeclaredConstructors () :所有构造方法
//获取单个构造方法
//public Constructor<T> getConstructor (C1ass<?>... parameterTypes)
// 参数表示的是:你要获取的构造方法的构造参数个数及数据类型的clas s字节码文件对象
//public T newInstance (object. .. initargs)
// 使用此Constructor对象表示的构造方法来创建该构造方法的声 明类的新实例,并用指定的初始化参数初始化该实例。
public class ReflectDemo {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
Class p=Class.forName("reflect_study_01.Person");
//Constructor [] c=p.getConstructors();//所有公共构造方法
//Constructor [] c = p.getDeclaredConstructors();//所有构造方法
// for (Constructor con:c)
// {
// System.out.println(con);
// }
Constructor c =p.getConstructor(String.class,int.class);
Object obj=c.newInstance("zsp",20);
System.out.println(obj);
}
}
//需求:通过反射获取私有构造方法并使用
//使用 con.setAccessible(true);为七rue则指示反射的对象在使用时应该取消Java语言访问检查。
public class ReflectDemo {
package reflect_study_03;
import java.lang.reflect.Constructor;
//需求:通过反射获取私有构造方法并使用
//使用 con.setAccessible(true);为七rue则指示反射的对象在使用时应该取消Java语言访问检查。
public class ReflectDemo {
public static void main(String[] args) throws Exception {
Class p =Class.forName("reflect_study_01.Person");
Constructor con =p.getDeclaredConstructor(String.class) ;
con.setAccessible(true);
Object obj =con.newInstance("zsp");
System.out.println(obj);
}
}
给私有变量赋值:
//Field[] fields =p.getFields();//只能获取公共变量
//Field[] fields =p.getDeclaredFields();//获取全部变量
发现是私有变量及时使用setAccessible(true);
package reflect_study_04;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
//Class类:
// 成员支量 Field
// 构造方法 Constructor
// 成员方法 Method
//Field[] fields =p.getFields();//只能获取公共变量
//Field[] fields =p.getDeclaredFields();//获取全部变量
public class ReflectDemo {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
Class p=Class.forName("reflect_study_01.Person");
//Field[] fields =p.getFields();//只能获取公共变量
//Field[] fields =p.getDeclaredFields();//获取全部变量
// for (Field field:fields)
// {
// System.out.println(field);
// }
Field fieldname =p.getDeclaredField("name");
fieldname.setAccessible(true);
Constructor con =p.getDeclaredConstructor();
Object obj =con.newInstance();
fieldname.set(obj,"zsp");
System.out.println(obj);
}
}
反射使用成员方法
package reflect_study_05;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
// 获取所有方法
// getMethods
// getDeclaredMethods
// 获取单个方法
// getMethod
// getDeclaredMethod
// 暴力访问
// method. ssetAccessible(true) ;
public class ReflectDemo {
public static void main(String[] args) throws Exception {
Class p =Class.forName("reflect_study_01.Person");
// Method[] methods = p.getMethods();//返回一切公共方法,包括继承到的
// Method[] methods = p.getDeclaredMethods();//返回自己有的方法
// for (Method method:methods)
// {
// System.out.println(method);
// }
Constructor con =p.getDeclaredConstructor();
Object obj =con.newInstance();
Method method1 =p.getMethod("show");
method1.invoke(obj);
System.out.println("-------------------------------");
Method method2 =p.getMethod("setAge",int.class);//后面填写的是传过去的参数
method2.invoke(obj,100);
System.out.println(obj);
System.out.println("-----------------------------------");
Method method3 =p.getMethod("method", String.class, int.class);
String line = (String) method3.invoke(obj,"zsp",100);
System.out.println(line);
}
}
这是我使用到的Class文件:
package reflect_study_01;
public class Person {
private String name ;
public int age;
private String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
Person(int age) {
this.age = age;
}
private Person(String name) {
this.name = name;
}
public Person() {
}
public void show(){
System.out.println("Person{" +
"name='" + name + '\'' +
", age=" + age +
'}');
}
public String method(String name,int age){
return ""+name+age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}