javaSE基础语法--反射
程序员文章站
2022-03-26 22:00:29
认识反射13.1.反射是什么,有什么作用?反射—在程序运行的过程中,我们可以得到某个类的对象,可以调用某个类中的任何一个变量/方法,这种动态获取信息的过程就是反射。当我们在没有见过某个类的情况下,仅凭一个完整的类名,就可以获取到整个类的所有信息。反射的使用场景:jdbc加载数据库驱动Servlet的web.xml配置Spring框架13.2.实例对象与反射对象的相互转换?实例对象-----就是我们通过类创建的对象反射对象-----通过反射机制得到的类对象例如: 反射就是一面镜子,...
认识反射
13.1.反射是什么,有什么作用?
反射—在程序运行的过程中,我们可以得到某个类的对象,可以调用某个类中的任何一个变量/方法,这种动态获取信息的过程就是反射。
当我们在没有见过某个类的情况下,仅凭一个完整的类名,就可以获取到整个类的所有信息。
反射的使用场景:
- jdbc加载数据库驱动
- Servlet的web.xml配置
- Spring框架
13.2.实例对象与反射对象的相互转换?
实例对象-----就是我们通过类创建的对象
反射对象-----通过反射机制得到的类对象
例如: 反射就是一面镜子,镜子前面的你就是实例对象,通过镜子得到的镜子里面的你就是反射对象。
反射对象是一个Class类型的对象
Class—不是创建类的关键字,表示一个类,所以反射对象是一个Class类型的对象
public final class Class
1. 通过实例对象得到反射对象
package com.wangxing.test4;
public class Student {
public void shili(){
System.out.println("student的实例对象");
}
}
测试反射:
package com.wangxing.test4;
public class TestMain {
public static void main(String[] args)throws Exception {
//得到反射对象
//1.通过实例对象的带反射对象
Student stu=new Student();
Class stuclass=stu.getClass();
//通过Class类的forname(类名【包+类名】)
Class stuClass2=Class.forName("com.wangxing.test4.Student");
}
}
2. 通过反射对象得到实例对象
package com.wangxing.test4;
public class TestMain {
public static void main(String[] args)throws Exception {
//通过反射对象得到实例对象
Class stuClass2=Class.forName("com.wangxing.test4.Student");
Student stu=(Student) stuClass2.newInstance();
stu.shili();
}
}
13.3.通过反射对象得到构造方法\成员变量\成员方法
Constructor<?>[] getConstructors() 得到构造方法
Field[] getDeclaredFields() 得到成员变量
Method[] getDeclaredMethods() 得到成员方法
Class<?>[] getInterfaces() 得到接口。
Class<? super T> getSuperclass() 得到父类。
Package getPackage() 得到包对象。
int getModifiers() Java语言修饰符
Modifier的toString(int mod)
String getName() 得到类名称
例如:
接口:
package com.wangxing.test4;
public interface MytestInterface {
}
父类:
package com.wangxing.test4;
public class Person {
}
Student类
package com.wangxing.test4;
//继承person类实现MytestInterface接口
public class Student extends Person implements MytestInterface {
//私有变量
private String name;
private int age;
//无参构造方法
public Student(){
}
//带参构造方法
public Student(String name){
this.name=name;
}
public void shili(){
System.out.println("student的实例对象");
}
}
测试类:
package com.wangxing.test4;
import java.lang.reflect.Modifier;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class TestMain2 {
public static String testname(String classname){
// classname.substring(classname.lastIndexOf(".")+1);
return classname.substring(classname.lastIndexOf(".")+1);
}
public static void main(String[] args)throws Exception {
/*
* Constructor<?>[] getConstructors() 得到构造方法
* Field[] getDeclaredFields() 得到成员变量
* Method[] getDeclaredMethods() 得到成员方法
* Class<?>[] getInterfaces() 得到接口。
* Class<? super T> getSuperclass() 得到父类。
* Package getPackage() 得到包对象。
* int getModifiers() Java语言修饰符
Modifier的toString(int mod)
*String getName() 得到类名称
*/
//反射对象
Class stuclass=Class.forName("com.wangxing.test4.Student");
//得到包名
String pagename=stuclass.getPackage().getName();
String stringinfo="package "+pagename+";";
System.out.println(stringinfo);
//得到类的信息
//修饰信息
String classxiushi=Modifier.toString(stuclass.getModifiers());
//得到类名
String leiming=testname(stuclass.getName());
//得到父类名
String supername=testname(stuclass.getSuperclass().getName());
//得到接口名
StringBuilder interinfo=new StringBuilder();
Class interfacearr[]=stuclass.getInterfaces();
for(Class inter:interfacearr){
String intername=testname(inter.getName());
interinfo.append(intername+",");
}
interinfo.deleteCharAt(interinfo.length()-1);
//转string
// System.out.println(interinfo.toString());
String classinfo=classxiushi+" class "+leiming+" extends "+supername+" implements "+interinfo.toString()+" {";
System.out.println(classinfo);
//得到成员变量
Field fieldarr[]=stuclass.getDeclaredFields();
for(Field chengyuan:fieldarr){
//成员修饰
String chengyuanxiushifu=Modifier.toString(chengyuan.getModifiers());
//数据类型
String chengyuanleixing=testname(chengyuan.getType().getName());
//成员变量名称
String chengyuanname=chengyuan.getName();
String chengyuaninfo=chengyuanxiushifu+" "+chengyuanleixing+" "+chengyuanname+";";
System.out.println("\t"+chengyuaninfo);
}
//得到类中的构造方法
Constructor Constructorarr[]=stuclass.getConstructors();
for(Constructor gzff:Constructorarr){
//构造方法修饰
String gzffxiushi=Modifier.toString(gzff.getModifiers());
//构造方法名
String gzffname=gzff.getName();
StringBuilder canshu=new StringBuilder();
//参数类型
Class conptype[]=gzff.getParameterTypes();
if(conptype.length!=0){
for(Class typeclass:conptype){
String typename=testname(typeclass.getName());
canshu.append(typename+" name,");
}
canshu.deleteCharAt(canshu.length()-1);
}
String gzffinfo=gzffxiushi+" "+gzffname+"("+canshu.toString()+"){}";
System.out.println("\t"+gzffinfo);
}
//得到实例方法
Method methodarr[]=stuclass.getDeclaredMethods();
for(Method meth:methodarr){
String mothxiu=Modifier.toString(meth.getModifiers());
String tereturn=testname(meth.getReturnType().getName());
String methname=meth.getName();
StringBuilder canshu=new StringBuilder();
Class mathodptype[]=meth.getParameterTypes();
if(mathodptype.length!=0){
for(Class typeclass:mathodptype){
String typename=testname(typeclass.getName());
canshu.append(typename+" args,");
}
canshu.deleteCharAt(canshu.length()-1);
}
String methodinfo=mothxiu+" "+tereturn+" "+methname+"("+canshu.toString()+"){}";
System.out.println("\t"+methodinfo);
}
System.out.println("}");
}
}
本文地址:https://blog.csdn.net/sinat_50855580/article/details/112675563
上一篇: java List去除重复数据的五种方式