java反射获取实现类_Java介绍通过反射获取类的信息
免费学习推荐:java基础教程
目录1.获取Field
2.反编译Field
3.通过反射机制访问对象属性
4.可变长度参数
5.反射Method(了解)
6.反编译(了解)
7.反射机制调用方法
8.反射Constructor
9.反射机制调用构造方法
10.获取父类和父接口
在前面一节我们介绍了反射机制的详细内容反射机制,本节我们将介绍通过反射获取类的属性、方法等信息。
1.获取Fieldpublic class ReflectTest03 {
public static void main(String[] args) throws Exception{
//1.获取整个类
Class studentClass=Class.forName("cn.yujie.bean.Student");
String className=studentClass.getName();
System.out.println(className);
System.out.println(studentClass.getSimpleName());
//获取类中的所有public的Field
Field[] fields=studentClass.getFields();
System.out.println(fields.length); //测试数组中只有1个元素
//测试这个field
Field f=fields[0];
//取出field的它的名字
String fieldName=f.getName();
System.out.println(fieldName);
//获取所有的Field
//获取所有的Field
Field[] fs=studentClass.getDeclaredFields();
System.out.println(fs.length);
System.out.println("-----------------");
//遍历
for(Field field :fs){
//获取属性的修饰符列表
//返回的修饰符是一个数字,每个数字是修饰符的代号
int i=field.getModifiers();
//可以将这个代号数字转换成字符串
String ModifierString = Modifier.toString(i);
System.out.print(ModifierString+" ");
//获取属性的类型
Class fieldType=field.getType();
String fName=fieldType.getSimpleName();
System.out.print(fName+" ");
//获取属性的名字
System.out.println(field.getName()+" ");
System.out.println();
}
}}
2.反编译Field
通过反射机制,反编译一个类的属性Fieldpublic class ReflectTest05 {
public static void main(String[] args) throws Exception{
//创建这个是为了拼接字符串
StringBuilder s=new StringBuilder();
Class studentClass=Class.forName("cn.yujie.bean.Student");
s.append(Modifier.toString(studentClass.getModifiers())+" class "+studentClass.getSimpleName()+"{");
Field[] fields=studentClass.getDeclaredFields();
s.append(";
");
for(Field field:fields){
s.append("");
s.append(Modifier.toString(field.getModifiers()));
s.append(" ");
s.append(field.getType().getSimpleName());
s.append(" ");
s.append(field.getName());
s.append(";
");
}
s.append("}");
System.out.println(s);
}}
3.通过反射机制访问对象属性
必须掌握:
怎么通过反射机制访问一个对象的属性
给属性赋值set
获取属性的值getpublic class ReflectTest07 {
public static void main(String[] args) throws Exception{
Class studentClass=Class.forName("cn.yujie.bean.Student");
//使用反射机制,怎么取访问一个对象的属性
Object obj=studentClass.newInstance(); //obj就是student对象(底层调用无参数构造方法)
//获取no属性(根据属性的名称获取Field)
Field noFiled=studentClass.getDeclaredField("no");
//给obj对象(Student对象)的no属性赋值
//s.no=111; //给s对象的no属性赋值111,三要素,对象,属性和值
//虽然使用了反射机制,但是三要素还是缺一不可
//注意,反射机制让代码复杂了,但是为了一个灵活,这也是值得的。
noFiled.set(obj,222); //给obj对象的no属性赋值222
//读取属性的值
//两个要素:获取obj对象no属性的值
System.out.println(noFiled.get(obj));
//可以访问私有属性吗
Field nameField=studentClass.getDeclaredField("name");
//打破封装(反射机制的缺点:打破封装,可能会给不法分子留下机会)
nameField.setAccessible(true);
//给name属性赋值
nameField.set(obj,"jackson");
//获取name属性的值
System.out.println(nameField.get(obj));
}}
4.可变长度参数
可变长度参数
int… args这就是可变长度参数
语法是:类型…(注意:一定是3个点)1.可变长度参数要求的参数个数是0-n个
2.可变长度参数在参数列表中必须在最后一个位置上,而且可变长度参数必须只有一个
3.可变长度可以看成一个数组public class ArgumentsTest {
public static void main(String[] args) {
m();
m(10);
m(20,40);
//m("abc");编译错误
m3("ab","cd","def","de9");
String [] strs={"a","b","c"};
m3(strs);
}
public static void m(int... args){
}
//必须在最后一个,且只有1个// public static void m2(String... args1,int...args2){ }
public static void m3(String ...args){
//可以将可变长度参数当成一个数组来看
for(int i=0;i
System.out.println(args[i]);
}
}}
5.反射Method(了解)public class ReflectTest08 {
public static void main(String[] args) throws Exception{
//获取类了
Class userServiceClass = Class.forName("cn.yujie.service.UserService");
//获取所有的Method(包括私有的)
Method[] methods=userServiceClass.getDeclaredMethods();
System.out.println(methods.length); //2
//遍历Method
for(Method method:methods){
//获取修饰符列表
System.out.println(Modifier.toString(method.getModifiers()));
//获取方法的返回值类型
System.out.println(method.getReturnType().getSimpleName());
//获取方法名
System.out.println(method.getName());
//方法的参数列表(一个方法的参数可能有多个)
Class[] parameterTypes=method.getParameterTypes();
for(Class parameterType:parameterTypes){
System.out.println(parameterType.getSimpleName());
}
}
}}
6.反编译(了解)public class ReflectTest09 {
public static void main(String[] args) throws Exception{
StringBuilder s=new StringBuilder();
Class userServiceClass = Class.forName("cn.yujie.service.UserService");
s.append("public class UserService{ ");
s.append(Modifier.toString(userServiceClass.getModifiers())+"class "+userServiceClass.getSimpleName()+"{ "+"
");
Method[] methods=userServiceClass.getDeclaredMethods();
for(Method method:methods){
s.append("");
s.append(Modifier.toString(method.getModifiers()));
s.append(" ");
s.append(method.getReturnType().getSimpleName());
s.append(" ");
s.append(method.getName());
s.append("(");
//参数列表
Class[] parameterTypes = method.getParameterTypes();
for(Class parameterType:parameterTypes){
s.append(parameterType.getSimpleName());
s.append(",");
}
s.append("){}
");
}
//删除指定下标位置上的字符
s.deleteCharAt(s.length()-1);
s.append("}");
System.out.println(s);
}}
7.反射机制调用方法
重点:必须掌握,通过反射机制怎么调用一个方法。反射机制让代码更具有通用性,将来修改配置文件后,创建的对象不一样了,调用的方法也不同了,但是java代码不需要做任何改动,这就是反射的魅力。public class ReflectTest10 {
public static void main(String[] args) throws Exception{
//通过反射机制调用方法
Class userServiceClass = Class.forName("cn.yujie.service.UserService");
//创建对象
Object obj=userServiceClass.newInstance();
//java中有重载,java中通过方法名和形参来区分方法
Method loginMethod=userServiceClass.getDeclaredMethod("login",String.class,String.class);
//调用方法
//调用方法有几个要素
//要素1:对象,要素2:方法名,要素3:参数列表,要素4:返回值
//反射机制中最重要的一个方法:必须记住
//四要素
/*
loginMethod方法,obj对象
admin,123是参数列表,retValue是返回值
* */
Object retValue=loginMethod.invoke(obj,"admin","123");
}}
8.反射Constructorpublic class ReflectTest11 {
public static void main(String[] args) throws Exception{
StringBuilder s=new StringBuilder();
Class vipClass=Class.forName("cn.yujie.bean.Vip");
s.append(Modifier.toString(vipClass.getModifiers()));
s.append(" class ");
s.append(vipClass.getSimpleName());
s.append("{
");
//拼接构造方法
Constructor[] constructors=vipClass.getDeclaredConstructors();
for(Constructor constructor:constructors){
s.append("");
s.append(Modifier.toString(constructor.getModifiers()));
s.append(" ");
s.append(vipClass.getSimpleName());
s.append("(");
Class[] parameterTypes=constructor.getParameterTypes();
for(Class parameterType:parameterTypes){
s.append(parameterType.getSimpleName());
s.append(",");
}
if(parameterTypes.length>0) {
s.deleteCharAt(s.length() - 1);
}
s.append("){}
");
}
s.append("}");
System.out.println(s);
}}
9.反射机制调用构造方法public class ReflectTest12 {
public static void main(String[] args) throws Exception{
//使用反射机制怎么创建对象
Class vipClass=Class.forName("cn.yujie.bean.Vip");
//调用无参构造方法
Object obj= vipClass.newInstance();
//调用有参数构造方法
//第一步:先获取到有参数构造方法
Constructor con=vipClass.getDeclaredConstructor(int.class,String.class,String.class,boolean.class);
//第二步:调用构造方法new对象
Object newObj=con.newInstance(110,"jackson","1999-10-11",true);
System.out.println(newObj);
}}
10.获取父类和父接口public class ReflectTest13 {
public static void main(String[] args) throws Exception {
//String举例
Class stringClass=Class.forName("java.lang.String");
//获取String的父类
Class superClass=stringClass.getSuperclass();
System.out.println(superClass.getSimpleName());
//获取String类实现的所有接口
Class[] interfaces=stringClass.getInterfaces();
for(Class in:interfaces){
System.out.println(in.getName());
}
}}相关免费学习推荐:java基础
java反射获取实现类_Java介绍通过反射获取类的信息相关推荐
- java 获取当前年_java中的反射(三) - kelexin
目录一.反射1.class类2.访问字段3.调用方法4.调用构造方法5.获取继承对象6.动态代理二.sping中的反射 本篇转自:本篇内容spring中的反射 java中的反射(一): java中的反 ...
- java反射机制是什么_java中的反射机制是什么?
java中的反射机制是什么? 发布时间:2020-05-21 22:45:50 来源:亿速云 阅读:156 作者:鸽子 java:"一切即对象",感觉java语言本身在不断践行着这 ...
- java构造一个水果类_Java基础入门之Object类、匿名内部类、构造方法的继承解析...
前言 大家好,我是Java进阶者.这篇文章我们主要介绍Java基础中的Object类.匿名内部类.构造方法的继承知识,一起来学习下吧! 一.Object类 1.Object类是所有类的父类,所有类都继 ...
- java封装对象实体类_Java 接口自动化系列--实体类之entity封装
实体包entity下面有4个类,主要存放java对象,每个类必须有私有属性,空参构造,get set方法 具体excel中数据信息见---工具类excel文章 1.API类 解析excel中接口信息的 ...
- java序列化和反序列化工具_Java 序列化和反序列化工具类并解决StreamCorruptedException问题 | 学步园...
问题: 若通过ObjectOutputStream向一个文件中多次以追加的方式写入Object,为什么用ObjectInputStream读取这些Object时,会产生StreamCorruptedE ...
- java.lang中所有的类_java.lang中的数学类
Math 类 Java 中,讲 Math 类定义为 final 类,不能再派生子类. Math 类中定义的常量和方法都用 static 修饰符来修饰,因此不必创建 Math 类的实例,可以通过类名直接 ...
- java util包类_java.util包下的类及常用方法
1.日期类 Date类 常用方法 创建日期对象:Date date = new Date ( ) ; 获取当前时间 以标准格式:date 获取当前时间的毫秒数:date.getTIme ( ) ...
- java 不能继承的类_java中不能继承的类有哪些?
在Java中,只要是被定义为final的类,也可以说是被final修饰的类,就是不能被继承的. 因为jdk的开发者认为,有一些最基本的类没要必要对开发者开放,如果用户继承时操作有误,很可能引入很多问题 ...
- java正则表达式类_java中正则表达式之Pattern类与Matcher类
java中正则表达式之Pattern类与Matcher类 ======================================================================= ...
最新文章
- Java并发编程-信号量
- python画长方形-怎么用python 画出任意占空比的一串矩形方波呢?
- 【Spring注解】@Condition条件注册
- python turtle画圆、循环法_实验与作业(Python)-03 Python程序实例解析(函数、循环、range、turtle)...
- 实验吧 貌似有点难 伪造ip
- 如何利用PHP会话显示出当前在线的用户
- 行业术语001--关键绩效指标KPI_NLP_ACL
- Octopress使用中经验总结
- 【恋上数据结构】排序算法前置知识及代码环境准备
- Python 到底是怎么火起来的??网友:真的值!
- Sonar - 部署常见问题及解决方法
- c++ 传入字符串 带返回值_python的数据类型(三):字符串
- 环境在c盘_笔记本电脑常见故障--清理C盘空间
- WINRAR青绿色透明主题皮肤 Vista/win 7下效果极佳
- 手机远程控制电脑方法(TeamViewer vs 向日葵)
- 使用 Task.Wait()?立刻死锁(deadlock)
- pytorch(7)——二十二种transforms数据预处理方法
- 万字好文!数据治理体系与能力提升
- 电路基础知识之什么是共模电感/共模信号/差分信号?
- 解决mybatis的SELECT command denied to user 'root'@'192.168.1.47' for table 'user'的报错。mysql用户权限修改,表权限修改。
热门文章
- 机器学习基础(八)——感知机(iterative optimization)
- SQOOP --hive-import 错误(Sqoop Hive exited with status 1)及解决
- python技巧——list comprehension vs map
- python创意实用案例-精心整理!9个 Python 实用案例分享
- 线上python课程一般多少钱-python学习费用多少合适
- python下载哪个版本好-python下载哪个版本好
- python代码写好了怎么运行-python的代码写在哪里,怎么样运行python代码
- 学python买什么书-关于 Python 的经典入门书籍有哪些?
- python能做什么工作-学Python能找到什么工作?这4种工作最热门!
- 零基础学python图文版-零基础学Python(图文版)