1.通过反射使用一个类
获取Class对象:
Class c1=student.class;
c1:就是student类的对象
返回值:class com.cn.student// student类的包名
student s=new student();
Class<?extends student> c3=s.getClass();//也是
Class<?> c4= Class.forName(“com.cn.student”);//也是
都可以返回类的:对象
package com.cn;
public class Dome2 {
public static void main(String[] args) throws ClassNotFoundException {
Class<student> c1=student.class;
System.out.println(c1);
Class<student> c2=student.class;
System.out.println(c2);
System.out.println("----------");
student s=new student();
Class<?extends student> c3=s.getClass();
System.out.println(c3==c1);
System.out.println("----------");
Class<?> c4= Class.forName("com.cn.student");
System.out.println(c4);
}
}
结果:
控制台输出了:
2.反射:获取类构造方法:并使用:
Class<?> c1=Class.forName(“com.cn.student”);
Constructor<?>[] cons=c1.getConstructors();//获取类的对象中:public:的构造方法,cons:类:构造方法数组
Constructor<?>[] conu=c1.getDeclaredConstructors();//
获取所有构造方法
package com.cn;
import java.lang.reflect.Constructor;
public class Dome3 {
public static void main(String[] args) throws ClassNotFoundException {
Class<?> c1=Class.forName("com.cn.student");
Constructor<?>[] cons=c1.getConstructors();
for(Constructor con:cons){//遍历Constructor对象数组
System.out.println(con);//con:数组中的元素
}
}
}
结果:返回public 公共的
补充:获取所有构造方法
Constructor<?>[] conu=c1.getDeclaredConstructors();//返回所有构造方法:私有,公共都能
for(Constructor con1:conu){//遍历Constructor对象数组
System.out.println(con1);
}
3.反射:获取构造方法并使用案例
Constructor<?> con= c1.getConstructor(String.class,int.class,String.class);//获取类特定的构造方法
Object obj=con.newInstance(“我是谁”,30,“北京”);
//创建object对象,并且
newInstance();//c\创建对象
其中类:
public student(String name,int age,String address)
{
this.name=name;
this.age=age;
this.address=address;
}
@Override
public String toString() {
return "student{" +
"age=" + age +
", name='" + name + '\'' +
", address='" + address + '\'' +
'}';
}
}
package com.cn;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class rtkfl {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
Class<?> c1=Class.forName("com.cn.student");
Constructor<?> con= c1.getConstructor(String.class,int.class,String.class);
Object obj=con.newInstance("我是谁",30,"北京");
System.out.println(obj);
}
}
结果:
4.反射:获取成员变量并使用:
Field[] fields=c1.getDeclaredFields();//获取类成员变量(所有)
Field addressfild=c1.getField(“address”);//获取类特别一个成员变量
Constructor<?> con=c1.getConstructor();//getConstructor后面无s ,创建类对象
Object obj=con.newInstance();//创建object对象
addressfild.set(obj,“西安”);//给成员变量赋值
package com.cn;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
public class weryv {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
Class<?> c1=Class.forName("com.cn.student");
Field[] fields=c1.getDeclaredFields();//Field获取类的成员变量,getDeclaredFields()返回所有:成员变量:公共的,私有的
for(Field con:fields){ //for循环
System.out.println(con);
}
System.out.println("--------------");
Field addressfild=c1.getField("address");
System.out.println(addressfild);
System.out.println("--------------");
Constructor<?> con=c1.getConstructor();//getConstructor后面无s
Object obj=con.newInstance();
System.out.println(obj);
addressfild.set(obj,"西安");//赋值:给成员变量,
System.out.println(obj);
}
}
结果:
5.反射获取成员方法并使用:
Method[] methods=c1.getMethods();//获取类成员方法:public:公共的,数组
Method c2= c1.getMethod(“ass”);//获取类中某一个成员方法
Constructor<?> aaa=c1.getConstructor();//创建对象
Object obj=aaa.newInstance(); //利用object,创建object对象,
c2.invoke(obj);// 有指定参数的指定对象上调用此方法
package com.cn;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Dome4 {
public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
Class<student> c1=student.class;//创建反射对象
Method[] methods=c1.getMethods();//获取类成员方法:public:公共的,数组
for(Method con:methods){ //遍历methods数组
System.out.println(con);
}
System.out.println("--------------");
Method c2= c1.getMethod("ass");//获取类中某一个成员方法
System.out.println(c2);
Constructor<?> aaa=c1.getConstructor();//创建对象
Object obj=aaa.newInstance(); //利用object,创建object对象,
c2.invoke(obj);// 获取的成员方法进行使用,invoke();是object中的一个方法:
//具有指定参数的指定对象上调用此方法
}
}
结果: