文章目录
前言
提示:以下是本篇文章正文内容,下面案例可供参考
一、反射机制的作用?
反射是java语言中的一种机制,
通过这种机制可以动态的实例化对象、读写属性、调用方法
二、Class对象的获取
1.类类
Class.forName(完整类名)
类名.class
对象getClass(0
通过class类型生成其他对象,生成不同的实体,赋予不同的值
代码如下(示例):
public class Test {
public static void main(String[] args) throws ClassNotFoundException {
// TODO Auto-generated method stub
//1.class.forName(),得到student的模板
Class <Student> stuClazz=(Class<Student>)Class.forName("com.zking.reflect.Student");
//2.Student.class
Class <Student> stuClazz01=Student.class;
//3.对象.getClass
Student stu=new Student();
Class<Student> stuClazz02=(Class<Student>)stu.getClass();
}
}
2.反射机制实例化对象
如果一个类里面没有构造函数,jvm虚拟机就会自动实现默认构造函数
getConstructor
newinstance
getDeclaredConstructor
代码如下(示例):
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class Test02 {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
//1.直接new对象
Student stu =new Student();
stu.setSname("zs");
//2.反射机制调用方法
Class <Student> stuClazz=(Class<Student>)Class.forName("com.zking.reflect.Student");
Student stu02=stuClazz.newInstance();
stu02.setSid("01");
stu02.setSname("zs");
//通过反射来获取Method
Method method=stuClazz.getMethod("hello");
Object obj=method.invoke(stu02);
System.out.println(obj);
Method m02=stuClazz.getMethod("hello", String.class);
m02.invoke(stu02, "hhsj");
//有返回值的情况,且是私有方法
Method m03=stuClazz.getDeclaredMethod("add", Integer.class,Integer.class);
m03.setAccessible(true);
int sum=(int)m03.invoke(stu02, 3,3);
System.out.println(sum);
}
}
3.反射机制调用方法
getDeclaredMethod
getMethod
import java.lang.reflect.Constructor;
public class Test03 {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
//1.直接new对象
Student stu =new Student();
//2.反射
Class <Student> stuClazz=(Class<Student>)Class.forName("com.zking.reflect.Student");
Constructor<Student> c1=stuClazz.getConstructor();
Student stu02=c1.newInstance();
stu02.setSid("01");
stu02.setSname("zs");
System.out.println("stu02="+stu02.getSname());
Constructor<Student> stuCon=stuClazz.getConstructor(String.class);
Student stu03=stuCon.newInstance("li");
System.out.println("stu03="+stu03.getSid());
}
}
4.反射读写属性
getDeclaredFields
import sun.text.resources.cldr.es.FormatData_es_419;
public class Test04 {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
//2.反射
Class <Student> stuClazz=(Class<Student>)Class.forName("com.zking.reflect.Student");
Student stu02=stuClazz.newInstance();
stu02.setSid("01");
stu02.setSname("zs");
stu02.setAge(20);
//动态的获取属性的值
Field f=stuClazz.getField("age");
int age=(int)f.get(stu02);
System.out.println(age);
//获取私有的属性
Field f02=stuClazz.getDeclaredField("sname");
f02.setAccessible(true);
String name=(String)f.get(stu02);
System.out.println(name);
f02.set(stu02, "hhsj");
System.out.print("****"+stu02.getSname());
Field[] fs=stuClazz.getDeclaredFields();
for(Field f04:fs){
f04.setAccessible(true);
System.out.println(f04.getName()+":"+f04.get(stu02));
}
}
}