廖雪峰Java4反射与泛型-1反射-2访问字段Field和3调用方法Method
2.字段Field
2.1.通过Class实例获取字段field信息:
- getField(name): 获取某个public的field,包括父类
- getDeclaredField(name): 获取当前类的某个field,不包括父类
- getFields(): 获取所有public的field,包括父类
- getDeclaredFields(): 获取当前类的所有field,不包括父类
Hello.java
package com.reflection;
import java.util.ArrayList;
public interface Hello {
ArrayList[] listname = new ArrayList[5];
public void hello();
}
Student.java
package com.reflection;
public class Student implements Hello{
private String name;
public int age ;
public Student(){
this("unNamed");
}
public Student(String name){
this.name=name;
}
public void hello(){
System.out.println(name+" is Student");
}
}
Main.java
package com.reflection;
import java.lang.reflect.Field;
public class Main {
public static void main(String[] args) throws NoSuchFieldException{
Class cls = Student.class;
System.out.println("获取age:"+cls.getField("age"));
System.out.println();
System.out.println("获取父类的listname:"+cls.getField("listname"));
System.out.println();
System.out.println("获取age:"+cls.getDeclaredField("age"));
System.out.println();
try{
System.out.println("获取父类的listname:"+cls.getDeclaredField("listname"));
}catch (Exception e){
System.out.println("获取父类的listname:"+e);
}
System.out.println();
System.out.println("获取全部的field,包含父类:");
for(Field field:cls.getFields()){
System.out.println(field);
}
System.out.println();
System.out.println("获取全部的field,不包括父类:");
for(Field field:cls.getDeclaredFields()){
System.out.println(field);
}
}
}
2.2.Field对象包含一个field的所有信息:
- getName()
- getType()
- getModifiers()
JAVA 反射机制中,Field的getModifiers()方法返回int类型值表示该字段的修饰符。
其中,该修饰符是java.lang.reflect.Modifier的静态属性。
对应表如下:
PUBLIC: 1 PRIVATE: 2 PROTECTED: 4 STATIC: 8
FINAL: 16 SYNCHRONIZED: 32 VOLATILE: 64
TRANSIENT: 128 NATIVE: 256 INTERFACE: 512
ABSTRACT: 1024 STRICT: 2048
Main.java
package com.reflection;
import java.lang.reflect.Field;
public class Main {
public static void main(String[] args) throws NoSuchFieldException{
Class cls = Student.class;
Field field1 = cls.getField("age");
System.out.println(field1.getName());
System.out.println(field1.getType());
System.out.println(field1.getModifiers());
}
}
2.3.获取和设置field的值:
- get(Object obj):
- set(Object,Object)
//疯狂Java840页
import java.lang.reflect.Field;
class Person {
private String name;
private int age;
public String toString(){
return "Person[name:" + name + ", age:" +age +"]";
}
}
public class FieldTest{
public static void main(String[] args) throws Exception{
Class cls = Person.class;
Person p = (Person) cls.newInstance();
Field nameField = cls.getDeclaredField("name");
nameField.setAccessible(true);
nameField.set(p,"小明");
Field ageField = cls.getDeclaredField("age");
ageField.setAccessible(true);
ageField.set(p,12);
System.out.println(p.toString());
System.out.println(ageField.get(p));
System.out.println(nameField.get(p));
}
}
2.4.通过反射访问Field需要通过SecurityManager设置的规则。
通过设置setAccessible(true)来访问非public字段。
3.调用方法Method
3.1通过class实例获取方法Method信息:
- getMethod(name,Class...):获取某个public的method(包括父类)
- getDeclaredMethod(name,Class...):获取当前类的某个method(不包括父类)
- getMethods():获取所有public的method(包括父类)
- getDeclaredMethods():获取当前类的所有method(不包括父类)
Animal.java
package com.reflection;
public class Animal {
public void run(){
System.out.println("动物再跑");
}
private void eat(String s,String i){
System.out.println("动物每天能吃"+i+"Kg"+s);
}
}
Dog.java
package com.reflection;
public class Dog extends Animal {
public void bar(){
System.out.println("狗在叫");
}
private void func(){
System.out.println("狗能看家");
}
}
Go.java
package com.reflection;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Go {
public static void main(String[] args) throws ClassNotFoundException,NoSuchMethodException,IllegalAccessException,InstantiationException,InvocationTargetException {
Class cls = Class.forName("com.reflection.Dog");
Dog dog = (Dog)cls.newInstance();
System.out.println("getMethod获取某个public的method,包括父类");
Method pubMethod1 = cls.getMethod("run");
System.out.print(pubMethod1.getName()+":");
pubMethod1.invoke(dog);
Method pubMethod2 = cls.getMethod("bar");
System.out.print(pubMethod2.getName()+":");
pubMethod2.invoke(dog);
System.out.println();
System.out.println("getDeclaredMethod:获取当前类的某个method,不包括父类");
Method subMethod1 = cls.getDeclaredMethod("func");
System.out.println(subMethod1.getName());
Method subMethod2 = cls.getDeclaredMethod("bar");
System.out.println(subMethod2.getName());
System.out.println();
System.out.println("getMethods():获取所有public的method(包括父类)");
for(Method m:cls.getMethods()){
System.out.println(m.getName());
}
System.out.println();
System.out.println("getDeclaredMethods():获取当前类的所有method(不包括父类)");
for(Method m:cls.getDeclaredMethods()){
System.out.println(m.getName());
}
}
}
## 3.2Method对象包含一个method的所有信息
* getName()
* getReturnType()
* getParameterTypes()
* getModifiers()
```#java
public class Go {
public static void main(String[] args) throws ClassNotFoundException,NoSuchMethodException,IllegalAccessException,InstantiationException,InvocationTargetException {
Class cls = Class.forName("com.reflection.Dog");
Dog dog = (Dog)cls.newInstance();
Method pubMethod1 = cls.getMethod("bar");
System.out.println(pubMethod1.getName());
System.out.println(pubMethod1.getReturnType());
System.out.println(pubMethod1.getParameterTypes());
System.out.println(pubMethod1.getModifiers());
}
}
<img src="https://img2018.cnblogs.com/blog/1418970/201902/1418970-20190219195137187-650653198.png" width="500" />
## 3.3调用Method:
* Object invoke(Object obj,Object...args)
通过设置setAccessible(true)来访问非public方法
反射调用Method也遵守多态的规则
<font color=#9400D3>参见3.1中代码</font>
参考博客:
[https://blog.csdn.net/z69183787/article/details/23852517](https://blog.csdn.net/z69183787/article/details/23852517)
[https://blog.csdn.net/GhostFromHeaven/article/details/6498350](https://blog.csdn.net/GhostFromHeaven/article/details/6498350)
廖雪峰Java4反射与泛型-1反射-2访问字段Field和3调用方法Method的更多相关文章
- C# -- 使用反射(Reflect)获取dll文件中的类型并调用方法
使用反射(Reflect)获取dll文件中的类型并调用方法 需引用:System.Reflection; 1. 使用反射(Reflect)获取dll文件中的类型并调用方法(入门案例) static v ...
- XML序列化 判断是否是手机 字符操作普通帮助类 验证数据帮助类 IO帮助类 c# Lambda操作类封装 C# -- 使用反射(Reflect)获取dll文件中的类型并调用方法 C# -- 文件的压缩与解压(GZipStream)
XML序列化 #region 序列化 /// <summary> /// XML序列化 /// </summary> /// <param name="ob ...
- 廖雪峰Java4反射与泛型-3范型-6super通配符
1.super通配符 1.1super通配符第一种用法 泛型的继承关系 Pair<Integer>不是Pair<Number>的子类,如 static void set(Pai ...
- 通过反射获取及调用方法(Method)
1.获取方法使用反射获取某一个类中的方法,步骤:①找到获取方法所在类的字节码对象②找到需要被获取的方法 Class类中常用方法: public Method[] getMethods():获取包括自身 ...
- 廖雪峰Java4反射与泛型-3泛型-7泛型和反射
1.部分反射API是泛型 1.1获取反射API的泛型 部分反射API是泛型,如Class<T>是泛型 //如果使用Class,不带泛型,出现compile warning编译警告 Clas ...
- 廖雪峰Java4反射与泛型-3范型-4擦拭法
1.擦拭法是Java泛型的实现方式. 编译器把类型视为Object. * 泛型代码编译的时候,编译器实际上把所有的泛型类型T统一视为Object类型.换句话说,虚拟机对泛型一无所知,所有的工作都是编译 ...
- 廖雪峰Java4反射与泛型-2注解-3处理注解
1.处理注解 注解本身对对代码逻辑没有任何影响 SOURCE类型的注解在编译期就被丢掉了 CLASS类型的注解仅保存在class文件中 RUNTIME类型的注解在运行期可以被读取 如何使用注解由工具决 ...
- 廖雪峰Java4反射与泛型-1反射-1Class类
1.Class类与反射定义 Class类本身是一种数据类型(Type),class/interface的数据类型是Class,JVM为每个加载的class创建了唯一的Class实例. Class实例包 ...
- 廖雪峰Java4反射与泛型-3范型-5extends通配符
1.泛型的继承关系: Pair<Integer>不是Pair<Number>的子类 add()不接受Pair<Integer> Pair.java package ...
随机推荐
- hdu4998 Rotate 计算几何
Noting is more interesting than rotation! Your little sister likes to rotate things. To put it easie ...
- PyCharm下载安装
PyCharm 是一款功能强大的 Python 编辑器,具有跨平台性,鉴于目前最新版 PyCharm 使用教程较少,为了节约时间,来介绍一下 PyCharm 在 Windows下是如何安装的. 这是 ...
- 使用JQuery反向选择checkbox
HTML代码: <input id="haspda" type="checkbox" name="haspda" value=&quo ...
- webpack 搭建问题汇总
总结一下遇到的问题: 1.这样的警告(The 'mode' option has not been set, webpack will fallback to 'production' for thi ...
- 高性能kv存储之Redis、Redis Cluster、Pika:如何应对4000亿的日访问量?
一.背景介绍 随着360公司业务发展,业务使用kv存储的需求越来越大.为了应对kv存储需求爆发式的增长和多使用场景的需求,360web平台部致力于打造一个全方位,适用于多场景需求的kv解决方案.目前, ...
- "ERR unknown command 'cluster'"
golang 连接redis 集群提示 "ERR unknown command 'cluster'" redisdb = redis.NewClusterClient(& ...
- mino 路径格式的bucket 数据访问
实施上这个功能很简答,如果官方不支持,我们可以通过基于nginx 的url rewrite 也可以实现 格式说明 如果配置了domain minio 会将 http://mydomain.com/bu ...
- Babelfish 基本试用
测试使用docker 部署 docker-compose文件 注意网络模型选择的host,同时配置了opentracing 服务 version: "3" services: b ...
- Web API统一异常处理 【转载】
前面讲了webapi的安全验证和参数安全,不清楚的朋友,可以看看前面的文章,<Web API系列(二)接口安全和参数校验>,本文主要介绍Web API异常结果的处理.作为内部或者是对外提供 ...
- vsphere和vmware快照的不足之处
当快照创建时虚拟机执行一个读操作,hypervisor会检查快照VMDK,查看是否有被读取的区块存在.如果有,则从快照中为虚拟机提供这个区块,如果没有,虚拟机还需要去读取基础VMDK.如果只有一个快照 ...