免费学习推荐: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介绍通过反射获取类的信息相关推荐

  1. java 获取当前年_java中的反射(三) - kelexin

    目录一.反射1.class类2.访问字段3.调用方法4.调用构造方法5.获取继承对象6.动态代理二.sping中的反射 本篇转自:本篇内容spring中的反射 java中的反射(一): java中的反 ...

  2. java反射机制是什么_java中的反射机制是什么?

    java中的反射机制是什么? 发布时间:2020-05-21 22:45:50 来源:亿速云 阅读:156 作者:鸽子 java:"一切即对象",感觉java语言本身在不断践行着这 ...

  3. java构造一个水果类_Java基础入门之Object类、匿名内部类、构造方法的继承解析...

    前言 大家好,我是Java进阶者.这篇文章我们主要介绍Java基础中的Object类.匿名内部类.构造方法的继承知识,一起来学习下吧! 一.Object类 1.Object类是所有类的父类,所有类都继 ...

  4. java封装对象实体类_Java 接口自动化系列--实体类之entity封装

    实体包entity下面有4个类,主要存放java对象,每个类必须有私有属性,空参构造,get set方法 具体excel中数据信息见---工具类excel文章 1.API类 解析excel中接口信息的 ...

  5. java序列化和反序列化工具_Java 序列化和反序列化工具类并解决StreamCorruptedException问题 | 学步园...

    问题: 若通过ObjectOutputStream向一个文件中多次以追加的方式写入Object,为什么用ObjectInputStream读取这些Object时,会产生StreamCorruptedE ...

  6. java.lang中所有的类_java.lang中的数学类

    Math 类 Java 中,讲 Math 类定义为 final 类,不能再派生子类. Math 类中定义的常量和方法都用 static 修饰符来修饰,因此不必创建 Math 类的实例,可以通过类名直接 ...

  7. java util包类_java.util包下的类及常用方法

    1.日期类 Date类 常用方法 ​创建日期对象:Date date = new Date ( ) ; ​获取当前时间 以标准格式:date ​获取当前时间的毫秒数:date.getTIme ( ) ...

  8. java 不能继承的类_java中不能继承的类有哪些?

    在Java中,只要是被定义为final的类,也可以说是被final修饰的类,就是不能被继承的. 因为jdk的开发者认为,有一些最基本的类没要必要对开发者开放,如果用户继承时操作有误,很可能引入很多问题 ...

  9. java正则表达式类_java中正则表达式之Pattern类与Matcher类

    java中正则表达式之Pattern类与Matcher类 ======================================================================= ...

最新文章

  1. Java并发编程-信号量
  2. python画长方形-怎么用python 画出任意占空比的一串矩形方波呢?
  3. 【Spring注解】@Condition条件注册
  4. python turtle画圆、循环法_实验与作业(Python)-03 Python程序实例解析(函数、循环、range、turtle)...
  5. 实验吧 貌似有点难 伪造ip
  6. 如何利用PHP会话显示出当前在线的用户
  7. 行业术语001--关键绩效指标KPI_NLP_ACL
  8. Octopress使用中经验总结
  9. 【恋上数据结构】排序算法前置知识及代码环境准备
  10. Python 到底是怎么火起来的??网友:真的值!
  11. Sonar - 部署常见问题及解决方法
  12. c++ 传入字符串 带返回值_python的数据类型(三):字符串
  13. 环境在c盘_笔记本电脑常见故障--清理C盘空间
  14. WINRAR青绿色透明主题皮肤 Vista/win 7下效果极佳
  15. 手机远程控制电脑方法(TeamViewer vs 向日葵)
  16. 使用 Task.Wait()?立刻死锁(deadlock)
  17. pytorch(7)——二十二种transforms数据预处理方法
  18. 万字好文!数据治理体系与能力提升
  19. 电路基础知识之什么是共模电感/共模信号/差分信号?
  20. 解决mybatis的SELECT command denied to user 'root'@'192.168.1.47' for table 'user'的报错。mysql用户权限修改,表权限修改。

热门文章

  1. 机器学习基础(八)——感知机(iterative optimization)
  2. SQOOP --hive-import 错误(Sqoop Hive exited with status 1)及解决
  3. python技巧——list comprehension vs map
  4. python创意实用案例-精心整理!9个 Python 实用案例分享
  5. 线上python课程一般多少钱-python学习费用多少合适
  6. python下载哪个版本好-python下载哪个版本好
  7. python代码写好了怎么运行-python的代码写在哪里,怎么样运行python代码
  8. 学python买什么书-关于 Python 的经典入门书籍有哪些?
  9. python能做什么工作-学Python能找到什么工作?这4种工作最热门!
  10. 零基础学python图文版-零基础学Python(图文版)