精华内容
下载资源
问答
  • Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个的对象,可以了解任意一个对象所属的,可以了解任意一个成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息...

    反射简介

    Java的反射( reflection )机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键。(摘抄自百度百科)

    咱们先弄个实体类用作测试

    public class DemoModel {
        private Integer age;
        private String name;
        private Date time;
        private String[] friends;
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name + " Chen";
        }
    
        public Date getTime() {
            return time;
        }
    
        public void setTime(Date time) {
            this.time = time;
        }
    
        public String[] getFriends() {
            return friends;
        }
    
        public void setFriends(String[] friends) {
            this.friends = friends;
        }
    }
    

    暴力法设值(Field)

    public static void main(String[] args) throws Exception{
    	DemoModel object = new DemoModel();
    	// 获取私有变量
    	try {
    		field = object.getClass().getDeclaredField("name");
    	} catch (NoSuchFieldException ex) {
    		// 子类不存在该变量那么尝试去父类获取变量
    		field=object.getClass().getSuperclass().getDeclaredField("name");
        }
    	// 强行授权访问私有成员变量
    	f.setAccessible(true);
    	f.set(object, "Jack");
    	System.out.println(object.getName());// 输出 Jack
    }
    

    Field简介

    • Field 是一个类,位于 java.lang.reflect 包下。在Java反射中Field类描述的是类属性信息。
    • 主要用于获取成员变量的类型、对成员变量赋值
    获取Field的4种方法
    • Class.getFields() 获取类中所有public修饰的属性,不含父类属性
    • Class.getDeclaredFields() 获取类中所有的属性(public、protected、default、private),不含父类属性
    • Class.getField(String name) 获取类特定的public修饰的属性,name参数指定了属性的名称,不可获得父类属性
    • Class.getDeclaredField(String name) 获取类特定的属性,name参数指定了属性的名称,不可获得父类属性
    Field的常用方法
    • getName() 获得该成员变量的名称
    • getType() 获得表示该成员变量类型的Class对象
    • get(Object obj) 得指定对象obj中成员变量的值,返回值为Object型
    • set(Object obj, Object value) 将指定对象obj中成员变量的值设置为value
    • setAccessible(boolean flag) 继承自AccessibleObject类,设值是否允许通过反射访问该字段。所以它的作用就是让我们在用反射时访问私有变量。

    但是这种暴力访问会破坏对象的封装性,例如上面案例中 setName 方法会将 name加上后缀 " Chen”,但是因为我们绕开了set方法,所以输出的name = “Jack”。

    通过属性描述器设值(PropertyDescriptor)

    public static void main(String[] args) throws Exception{
    	DemoModel object = new DemoModel();
    	// 获得属性描述器 如属性在父类:object.getClass().getSuperclass()
    	PropertyDescriptor propertyDescriptor = new PropertyDescriptor("name", object.getClass());
    	// 获得set方法
    	Method setMethod = propertyDescriptor.getWriteMethod();
    	// 调用指定对象set方法
    	setMethod.invoke(object, "Jack");
    	System.out.println(object.getName());// 输出Jack Chen
    }
    
    进阶版补充

    但是有些时候我们甚至不知道需要赋值的属性类型,那怎么办呢?
    看如下代码:

    public static void main(String[] args) throws Exception{
        Map<String,Object> map = new HashMap<>();
        map.put("time","2020-01-01 00:00:00");
        map.put("age",18);
        map.put("name","Jack");
        map.put("friends","Jay Chou,Stephen Chow,Andy Lau,Chow Yun Fat");
        DemoModel object = new DemoModel();
        for(Map.Entry<String, Object> entry : map.entrySet()){
            String mapKey = entry.getKey();
            Object mapValue = entry.getValue();
            // 这里使用暴力访问方式也行
            PropertyDescriptor propertyDescriptor = new PropertyDescriptor(mapKey, object.getClass());
            Method setMethod = propertyDescriptor.getWriteMethod();
            // 已知咱们都是调用set方法  且都只有一个参数 所以获取set方法的第一个参数的参数类型
            setMethod.invoke(object, getValue(mapValue,setMethod.getParameterTypes()[0]));
        }
        System.out.println(JSON.toJSONString(object)); // 输出 {"age":18,"friends":["Jay Chou","Stephen Chow","Andy Lau","Chow Yun Fat"],"name":"Jack Chen","time":1577808000000}
    }
    
    
    
    private static Object getValue(Object value,Class type){
        if (value != null){
            if (type.isAssignableFrom(String[].class))
                return toStringArray(value);
            if (type.isAssignableFrom(Integer[].class))
                return toIntegerArray(value);
            else if (type.isAssignableFrom(Integer.class) || type.isAssignableFrom(int.class) )
                return toInteger(value);
            if (type.isAssignableFrom(Double.class) || type.isAssignableFrom(double.class))
                return toDouble(value);
            else if (type.isAssignableFrom(Boolean.class) || type.isAssignableFrom(boolean.class))
                return toBoolean(value);
            else if (type.isAssignableFrom(String.class))
                return toString(value);
            else if (type.isAssignableFrom(Date.class))
                return toDate(value);
        }
        return null;
    }
    
    private static String[] toStringArray(Object value){
        return value.toString().split(",");
    }
    
    private static Integer[] toIntegerArray(Object value){
        String[] stringArray = toStringArray(value);
        Integer[] intArray = new Integer[stringArray.length];
        for (int i = 0; i < stringArray.length; i++){
            intArray[i] = Integer.parseInt(stringArray[i]);
        }
        return intArray;
    }
    
    private static Integer toInteger(Object value){
        return Integer.parseInt(value.toString());
    }
    
    private static Double toDouble(Object value){
        return Double.parseDouble(value.toString());
    }
    
    private static String toString(Object value){
        return value.toString();
    }
    
    private static Date toDate(Object value){
        return DateUtils.parseDate(value.toString(),DateUtils.DATE_FORMAT);
    }
    
    private static Boolean toBoolean(Object value){
        return Boolean.parseBoolean(value.toString());
    }
    
    展开全文
  • 通过ajaxjs成员变量赋值问题

    千次阅读 2016-05-19 10:06:16
    使用ajax给成员变量赋值需要取消异步否则或出现赋值失败 解决办法 在ajax里面加上async :false, 既可 function check(){ //SerialNo重复校验 var SerialNoVal = $("#SerialNo").textbox("getValue"); var ...

    使用ajax给成员变量赋值需要取消异步 否则或出现赋值失败

    原因:ajax为异步请求 在响应成功方法里面赋值 有可能响应没回来 下面代码直接取值 去到的就是ajax赋值之前的

    解决办法 在ajax里面加上

    async :false,

    既可

    function check(){
    	//SerialNo重复校验
    	var SerialNoVal = $("#SerialNo").textbox("getValue");
    	var SerialNoVal0 = $("#SerialNo0").val();
    	var flage = true;
    	if(SerialNoVal!=""&&SerialNoVal!=null&&SerialNoVal!=SerialNoVal0){
    		$.ajax({
    			type :"POST",
    			async :false,//取消异步 否则flage复制失败
    			url :'RenewalMgmt_dataquery_DatagridList.action?operator=check&SerialNo='+SerialNoVal,
    			datatype : "json",
    			// 访问完成后执行的方法
    			success : function(result) {
    				if(result.rows.length>0){
    					flage = false;
    					}
    			}
    		});
    	}
    	return flage;
    }

    展开全文
  • 转专业水混的课,技术没有学到家还是要从头补。。 赋值形式第一种 使用成员函数来赋值 内公有成员和私有成员都可以被赋值 ...//属性 成员变量 成员属性 int number; void set(string a, int b){ //行为 成员函...

    转专业水混的课,技术没有学到家还是要从头补。。

    赋值形式第一种  使用成员函数来赋值  类内公有成员和私有成员都可以被赋值

    #include<iostream>

    #include<string> //string 要引用头文件

    using namespace std;

    class student{

    public:

    string name;//属性  成员变量 成员属性

    int number;
    void set(string a, int b){   //行为  成员函数 成员方法
    name=a;
    number=b;

    }

     

    void show(){

    cout<<"姓名:"<<name<<endl<<"学号"<<number<<endl;

    }

    };
    int main(){
    student s,a;
    s.set("一季南凉",111111);//字符串要用""括起来
    s.show();
    a.set("张三",222222);
    a.show();
    return 0;
    }

    赋值第二种:如果成员属性有公有的成员

    直接 对象名.成员变量=所赋的值

    本例中为 s.name="一季南凉"  字符类型别忘了用双引号引起来。

    相似的,也可以在类内用类内成员函数来直接进行赋值

    #include<iostream>

    #include<string> //string 要引用头文件

    using namespace std;

    class student{
    public:
    string name;
    protected:
    string car;
    private:
    int number;
    public:
    void set(){
    name="一季南凉";
    number=333;

    }

     

    void show(){

    cout<<"姓名:"<<name<<endl<<"学号"<<number<<endl;

    }

    };
    int main(){
    student s;
    s.set();
    s.show();
    return 0;


    }

    我的博客园:一季南凉

    展开全文
  • C++ 如何私有成员变量赋值

    千次阅读 2019-03-11 14:17:21
    using namespace std; Class A { private: int a; int b; int c } int main() { A ma; int* p = int*(&...//相当于a赋值 p[1]=20;//相当于b赋值 p[2]=30;//相当于c赋值 return 0; } ...

    using namespace std;

    Class A

    {

    private:

    int a;

    int b;

    int c

    }

    int main()

    {

    A ma;

    int* p = int*(&ma);

    p[0]=10;//相当于给a赋值

    p[1]=20;//相当于给b赋值

    p[2]=30;//相当于给c赋值

    return 0;

    }

    展开全文
  • 因为你可以不是进行:成员变量 = 形参这个方向的赋值,你可能是执行:形参 = 成员变量这个方向的赋值。因为前提,它们都是指针嘛。今天我遇到了这样的一个错误:下面的程序,编译是正常通过的,但是运行却不行。(我...
  • 在继承出现之前,一个中的成员属性赋值有4种方式:  1)显示初始化 2)构造方法 3)setXxx方法 4)在程序中创建对象后再进行赋值成员属性没有被私有的情况) 当这个被另外一个继承后,即成为了父类,...
  • 问题描述 SpringBoot环境下, 在配置文件中有一个参数xxx是可配置的, 希望使一个抽象成员变量动态读取这个配置的值. 直接使用 @Value("...不要用@Value注解, 先abstract的xxx成员变量添加 gett...
  • handler和子线程不能给成员变量赋值,求解决办法,各位大神好心指点一下
  • 和Java相同,Objective-C也是采用动态类型,也就是程序员可以通过通过成员变量名字来获取和设置成员变量的值,但是Objective-C和Java有不尽相同。Java中所有的变量、函数都可以通过字符串来获取其地址,而Objective-...
  • 给成员变量赋值的两种方式的区别

    千次阅读 2017-05-02 22:19:50
    * 给成员变量赋值的两种方式的区别  * A:setXxx()方法 ****** 修改属性值   * B:构造方法 ****** 对象中属性进行初始化   *   * 在开发中用setxxx多一些 public class demon_var { public static...
  • php 成员变量赋值连接字符串报错

    千次阅读 2013-10-22 19:01:33
    今天遇到一个问题,对中的一个成员变量赋值,一直报错。这个成员变量是一个数组,数组的value是常量和字符串的连接。 原来成员变量中如果包含常量或变量,并且连接字符串要通过构造方法对成员变量赋值,否则常量在...
  • public class testdemo { private static final String name; static { name = "string"; try { ...但编译器就会认为这段代码会发生异常,从而没有将name进行赋值,会提示name需要初始化,这是一个坑
  • 在头文件的的定义中定义了一个const成员变量c++ 规则: 1、定义中不能进行初始化,因为头文件中的定义只是一个声明,并没有分配真正空间,因此变量是不存在的,因此是不能赋值的。 2、const 定义的变量是不能...
  • 使用构造方法: 创建的实例(对象)时使用构造方法 使用this关键字: 创建对象,为对象中的成员赋值时使用 成员变量与局部变量重名时使用 ...给成员变量赋值: 通过构造方法赋值 通过setXxx()方法赋值
  • 被调用的: 测试
  • 一个类成员变量struct赋值.

    千次阅读 2016-05-31 10:53:04
    SetValue赋值一般变量直接使用,但是struct需要装箱成object再进行就可以了. 不知道行不行using UnityEngine; using System.Collections; using TeamUtility.IO; using System.Reflection; using System;namespace HS...
  • 结构体中std::string成员变量赋值失败的行为:在c++中结构体中包含std::string时,要用new去分配内存,不用malloc在用new一个对象时,不能用memset去赋0操作,否则不能赋值...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 389,335
精华内容 155,734
关键字:

给类的成员变量赋值