【反射之Field】获取字段

■getFields()、getDeclaredFields()、getField() 和 getDeclaredField()的用法

 1 package reflect.field;
 2
 3 import java.lang.reflect.Constructor;
 4 import java.lang.reflect.Field;
 5 import java.lang.reflect.InvocationTargetException;
 6 import java.lang.reflect.Method;
 7
 8 public class FieldMethod {
 9
10     public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, SecurityException, NoSuchMethodException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
11         Class<?> personClass = Class.forName("reflect.Person");
12
13         Constructor<?> constructor = personClass.getDeclaredConstructor(String.class, int.class, double.class, String.class);
14         Object p = constructor.newInstance("周娟娟", 23, 80, "14计科1班");
15         System.out.println(p.toString());
16
17
18         // 该方法只能获取到公有的字段(属性)
19         Field[] fields = personClass.getFields();
20         for (Field field : fields) {
21 //            System.out.println(field);
22         }
23
24         // 该方法能获取到公有的、私有的、受保护的字段
25         Field[] declaredFields = personClass.getDeclaredFields();
26         for (Field field : declaredFields) {
27 //            System.out.println(field);
28         }
29
30         // 该方法只能获取到公有的字段,若传入的是私有或受保护的则会报错NoSuchFieldException
31         Field nameFieldPublic = personClass.getField("className");
32
33         nameFieldPublic.set(p, "卓越班");
34         Method getClassName = personClass.getMethod("getClassName");
35         Object className = getClassName.invoke(p);
36         System.out.println(className);
37
38         // 该方法可以获取到公有的、私有的、受保护的属性
39         Field nameFieldPrivate = personClass.getDeclaredField("name");
40
41         nameFieldPrivate.setAccessible(true);
42 //        System.out.println(nameFieldPrivate);
43         nameFieldPrivate.set(p, "Jay");
44         System.out.println(p);
45
46         // 获取到私有属性age
47         Field ageFieldPrivate = personClass.getDeclaredField("age");
48         // 忽略修饰符访问检查
49         ageFieldPrivate.setAccessible(true);
50         // 设置age的值,必须指明修改的是哪个对象的属性
51         ageFieldPrivate.set(p, 24);
52         System.out.println(p);
53
54     }
55
56 }
 1 package reflect;
 2
 3 public class Person {
 4
 5     private String name;
 6     private int age;
 7     protected double weight;
 8     public String className;
 9
10     public Person() {
11     }
12
13     private Person(int age) {
14
15     }
16
17     public Person(String name, int age, double weight, String className) {
18         super();
19         this.name = name;
20         this.age = age;
21         this.weight = weight;
22         this.className = className;
23     }
24
25     public double getWeight() {
26         return weight;
27     }
28
29     public void setWeight(double weight) {
30         this.weight = weight;
31     }
32
33     public String getClassName() {
34         return className;
35     }
36
37     public void setClassName(String className) {
38         this.className = className;
39     }
40
41     public String getName() {
42         return name;
43     }
44
45     public void setName(String name) {
46         this.name = name;
47     }
48
49     private int getAge() {
50         return age;
51     }
52
53     public void setAge(int age) {
54         this.age = age;
55     }
56
57     @Override
58     public String toString() {
59         return "Person [name=" + name + ", age=" + age + ", weight=" + weight
60                 + ", className=" + className + "]";
61     }
62
63
64
65 }
时间: 2024-10-25 22:22:58

【反射之Field】获取字段的相关文章

反射动态的获取字段&amp;暴力访问

import java.lang.reflect.Field; public class ReflectDemo3 { public static void main(String[] args) throws Exception { /* * 获取类中的成员 * 反射字段. */ getFieldDemo(); } public static void getFieldDemo() throws Exception{ String className = "cn.qujianlei.domai

利用反射机制,获取类的字段、方法、并实现简单调用

这篇文章是为之后要介绍Android的ICO框架做预备的,所以,如果想最近学习Android的ICO框架的同学,可以稍微看一下. 首先,简单介绍一下Java里面的反射. JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 不知道这样的一段解释,你能否看懂.如果更简单的说,反射就是能够根据你给出类名实例化出一个实实在在的对象.所以,对象的实例

利用反射获取字段并获取值或者设置值

package Reflect; import java.lang.reflect.Field;class User{ public String account; public String password;}class Student extends User{ public int age; public String name; private String sex; public Student() { System.out.println("调用无参构造器创建对象");

java中反射机制通过字节码文件对象获取字段和函数的方法

pclass = Class.forName("get_class_method.Person"); //Field ageField = pclass.getField("age");//因为age成员变量是私有的,所以会产生NoSuchFieldException异常 Field ageField = pclass.getDeclaredField("age");//获得该对象反映此 Class 对象所表示的类或接口的指定已声明字段 Obje

Java 使用反射拷贝对象一般字段值

在<Java解惑>上面看到第八十三例--诵读困难者,要求使用非反射实现单例对象的拷贝.查阅了部分资料,先实现通过反射拷贝对象. 1. 编写需要被拷贝的对象Person package com.scl.j2se.reflectjavabean; public class Person { public String getName() { return name; } public void setName(String name) { this.name = name; } public St

Java 反射机制[Field反射]

Java 反射机制[Field反射] 1.  反射概念及功能 反射就是把Java类中的各种成分映射成相应的Java类.例如一个Java类中用一个Class类的对象来表示.一个类中的组成部分分为成员变量,方法,构造方法,包等等. Java反射机制主要提供了以下功能: 判断在运行时任意一个对象所属的类:在运行时构造任意一个类的对象:判断在运行时任意一个类所具有的成员变量和方法:在运行时调用任意一个对象的方法:生成动态代理. 2.  Field反射 以下代码将obj对象中的String类型的字段对应的

反射学习2-通过反射机制动态获取属性的值模拟Struts的自动赋值

一.准备知识:   Java反射机制   处理事务的JavaBean   String的操作常用方法 二.模拟步骤   这里我们通过反射机制动态获取属性的值模拟Struts中的自动赋值. 1.首先创建一个简单的User类包含两个属性username和userid以及getter.setter方法: class User {     public User(){} private String username; private String userid; public String getUs

使用反射设置对象的字段值

package com.sadhu; import java.util.*; import java.lang.reflect.*; /** */ public class Sample {     public static void main(String[] args)throws Exception     {         Class cl = Class.forName("com.sadhu.ReflectTest");         Object rt = cl.ne

Java反射机制能够获取的信息,与应用

一.什么是Java反射机制? [1]反射机制是在运行状态中,对于任何一个类,都能够知道这个类的所有属性和方法: [2]对于任意一个对象,都能够调用它的任意一个属性和方法: 像这种动态获取类的信息以及动态调用对象的方法的骚操作称为java语言的反射机制. 二.Java反射机制能够获取及操作哪些信息? [1]获取类的包名 + 类名 1 package com.zyy.test.reflect; 2 3 public class TestReflect { 4 5 public static void

【特性】select语句中使用字符串链接获取字段值失败

坑1 在一个多行的表中,想把其中的一个字段值拿出来,组成一个字符串供后面使用. 按照以往,自己就如以下这么写了: declare @sql varchar(8000) set @sql='insert into XXX values(' select @sql=@sql+''','''+ field from YY 然后没有得到想要的所有行的字符串,第一行之后就没有了. 排查问题: 1. 自己仔细查看了数据,并打印出来,发现这个字段有换行. 于是自己又用replace把字段field的换行符,结