精华内容
下载资源
问答
  • Runtime修改变量值,交换方法实现,动态添加,成员变量和方法

    上篇博客讲解了如何使用Runtime获取一个类的成员变量,属性,方法,协议。这篇博客将详细讲解如何动态修改一个类的变量值,如何交换方法的实现,如何动态添加类。

    先做一下准备工作: 创建一个Person类





    下面开始以实际例子来讲解:

    1.在一般的认知中,写在.m中的成员变量属于私有变量,是不允许外部访问的。那通过Runtime的话,不管在.h还是在.m文件中的成员变量,我们都可以获取,而且可以动态修改它的值。(记得导入objc/runtime.h)





    打印结果如下:


    上面的代码先是获取来所有的成员变量,然后在运行时修改了name的值。


    2.交换两个方法的实现(method-swizzling)。

    先做点知识准备:


    这里说明一下:

    1)SEL其实就是一个整形标识,用来唯一标识一个方法名而已。而IMP是一个函数指针,表示方法实现的代码块地址。

    2) OC在编译时会为每个方法的名字生成一个唯一的整型标识来替代方法名,这个整型标识就是SEL。在一个类中是不可能存在两个同名的方法的,即使参数类型不同也不行。但是不同的类是可以有相同的SEL的,即使这些类有继承关系也行。因为不同的类,调用方法的对象实例是不一样的。

    3) 在一个工程中,所有的SEL会组成一个set集合,这就意味着不会有重复的SEL。



    上面是几个跟Method有关的方法。

    下面我们来看实际代码:




    打印效果如下:


    这里也说明一下:

    1)只要是在.m文件中实现的方法,不管又没有在.h文件中声明,都会被找到。不过若是在.h中声明的方法,没有在.m中实现的方法,是不会被找到的。

    2)在运行时交换方法后我们看到,明明调用了fun1,打印的确是fun2的结果,调用了fun2,打印的确是fun1的结果,很神奇。


    3.在运行时动态生成一个类,为其添加成员变量和方法。

    添加的方法必须是已经实现的,所以先手写这个方法。




    如上就动态创建了一个类。下面我们开始使用这个类。


    打印结果如下:


    说明我们成功地动态创建了一个类,并且为其添加类成员变量和方法。(注意点在代码的注释中)。


    好了,相信大家对Runtime又有更进一步的了解了。下篇博客将会讲解两个Runtime具体的使用,归档,Json字典和model相互转化。

    展开全文
  • 1.在__init__中定义self.__elements,其中self.__elements是类变量名,a是传入Difference的参数名,这里的__init__作用是定义了类变量名,将外部参数a传给类变量名。 2.直接在Difference中写类变量名...
    定义类变量的方式有两种
    1.在__init__中定义self.__elements,其中self.__elements是类变量名,a是传入Difference类的参数名,这里的__init__作用是定义了类变量名,将外部参数a传给类变量名。
    2.直接在类Difference中写类变量名maximumDifference,注意在类函数中调用该变量时需要用self.maximumDifference的形式
    
    class Difference:
        def __init__(self, a):
            self.__elements = a
    
        maximumDifference = 0
    
        def computeDifference(self):
            list_ = []
            for i in range(len(self.__elements)):
                for j in range(i+1,len(self.__elements)):
                    list_.append(abs(self.__elements[i]-self.__elements[j]))
            print(list_)
            self.maximumDifference=max(list_)#此处将类变量的初始值修改为max(list_)
    展开全文
  • java 方法修改外部变量不变

    千次阅读 2020-02-15 18:31:47
    优化代码的时候遇到,无法修改变量。 场景: 现有两个java 方法方法2包含在方法1中,方法1中的变量作为参数传入方法2,在方法2内部对这个传入的参数的进行了修改。 public static void main(String[] args)...

    问题:

    优化代码的时候遇到,无法修改变量的值。

    场景:

    现有两个java 方法,方法2包含在方法1中,方法1中的变量作为参数传入方法2,在方法2内部对这个传入的参数的值进行了修改。

        public static void main(String[] args) {
            String ts = "123";
            changeTest(ts); // 基础数据类型,无法修改ts的值
            System.out.println(ts);
        }
        private static void changeTest(String ts){
            System.out.println(ts);
            ts = "456"; // 修改对外部方法无效
        }
    

    无法这样修改的数据类型包含: 8大基本类型 和 String

    结论:

    1.如果传入的是基本类型,该变量在方法1中的值不变,需要return 返回值;
    2.如果传入的是引用类型(对象),不修改该变量原指针时,该变量在方法1中的值将改变。
    3.不管传入方法2的参数是什么类型,方法2内部都能够获取到方法1中该参数的值。

    展开全文
  • 平常访问/修改类对象的私有属性,需要使用gei/set方法访问,这里我们也可以通过反射机制直接访问/修改


    个人文章地址

    一、反射概念

    在程序运行过程中,可以直接获取一个类的所有属性、成员方法、构造方法
    简单理解就是,通过反射,可以将类中的变量、成员方法、构造方法各自封装成一个对象供我们使用。在反射面前,类的信息都是透明的。

    二、获取反射类的三种方法

    方法一:通过实例化对象获取
    Class studentClass = student.getClass();
    方法二:直接用路径获取
    Class studentClass = Class.forName(“Reflect.Student”);
    方法三:通过该类直接获取
    Class studentClass = Student.class;

    其中student为实例化的对象,Reflect.Student为Student类所在的路径,可结合下方的例子中理解

    三、获取类中的变量、成员方法、构造方法的方式

    1. 获取成员变量

    //获取所有public修饰的变量
    Field[] getFields()
    //获取指定字段的public修饰的变量
    Field getField(String name)
    //获取所有变量
    Field[] getDeclaredFields()
    //获取指定变量
    Field getDeclaredField(String name)
    

    2. 获取构造方法

     //获取所有public修饰的构造方法
    Constructor<?>[] getConstructors()
    //获取指定字段的public修饰的构造方法
    Constructor<T> getConstructor(<?>... parameterTypes)
    //获取所有构造方法
    Constructor<?>[] getDeclaredConstructors()
    //获取指定构造方法
    Constructor<T> getDeclaredConstructor(<?>... parameterTypes)
    

    3. 获取成员方法

     //获取所有public修饰的成员方法
    Method[] getMethods()
    //获取指定字段的public修饰的成员方法
    Method getMethod(String name,<?>... parameterTypes)
    //获取所有成员方法
    Method[] getDeclaredMethods()
    //获取指定成员方法
    Method getDeclaredMethod(String name,<?>... parameterTypes)
    

    四、通过反射在其它类中访问并修改对象的私有变量

    1. 目录:Student为类对象、ReflecrTest为测试类
    在这里插入图片描述
    2. 代码示例

    Student.java

    package Reflect;
    
    public class Student {
        public String name;//姓名
        public String sex;//性别
        private int age;//年龄
    
        //构造方法
        public Student(String name, String sex, int age) {
            this.name = name;
            this.sex = sex;
            this.age = age;
        }
    
        public Student() {
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getSex() {
            return sex;
        }
    
        public void setSex(String sex) {
            this.sex = sex;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        @Override
        public String toString() {
            return "Student{" +
                    "name='" + name + '\'' +
                    ", sex='" + sex + '\'' +
                    ", age=" + age +
                    '}';
        }
    }
    

    ReflectTest.java

    package Reflect;
    
    import java.lang.reflect.Field;
    
    public class ReflectTest {
        public static void main(String[] args) throws IllegalAccessException, NoSuchFieldException, ClassNotFoundException {
            //实例化对象
            Student student = new Student("小明","男",18);
            //正常通过对象的get方法访问private(age)变量
            System.out.println("正常通过对象的get方法访问私有变量:age为" + student.getAge());
    
            /*
            获取反射类
            方法一:通过实例化对象获取
            Class studentClass = student.getClass();
            方法二:直接用路径获取
            Class studentClass = Class.forName("Reflect.Student");
             */
            //方法三:通过该类直接获取
            Class studentClass = Student.class;
    
            //获取所有字段为age的变量
            Field field = studentClass.getDeclaredField("age");
            //设置忽略修饰符
            field.setAccessible(true);
            //获取成员变量age的值
            Object age = field.get(student);
            System.out.println("通过反射直接获取私有变量:age为" + age);
            //通过放射修改私有变量
            field.set(student,22);
    
            //输出该对象信息
            System.out.println("修改后的对象信息:\n" + student);
        }
    }
    

    结果:
    在这里插入图片描述

    因此,可以通过反射,我们可以获取到所有类型的类信息,并且可以修改类的信息,当然,反射的用法不止如此,这里就不细说了~

    展开全文
  • 成员变量 类变量 成员方法 ...而且所有的实例都可以修改这个类变量(这个类变量没有被final修饰的情况),而且访问类变量的时候不用实例,直接用类名.的方式就可以。成员方法:包括实例方法
  • 前端JS--在方法修改全局变量

    万次阅读 2018-07-09 15:18:00
    一般在方法里对全局变量修改仅限于方法体内,方法结束之后,全局变量就会恢复之前的,在前端的js代码里,可以通过使用ajax来修改全局变量:&lt;script type="text/javascript"&gt; var n...
  • vs在调试过程中修改变量

    千次阅读 2019-07-24 18:56:19
    在vs开发环境下,也可以在调试过程中修改变量方法如下 在VS能够单步调试,查看到变量的的前提下,打开局部变量窗口,如下 修改局部变量窗口中,变量的,如下 最终程序运行结果,如下 ...
  • Java对于修改Integer变量值的问题

    千次阅读 2018-04-30 23:58:05
    对于Integer变量来说,比较变量值常见情形如下:Integer a = 1000; Integer b = 1000; Integer c = 100; Integer d = 100; System.out.println(a == b); System.out.println(c == d); “==”比较的是地址的...
  • Java 基础之实例方法,实例变量类方法类变量

    千次阅读 多人点赞 2019-05-18 09:08:17
    实例变量(instance variable) 实例变量:或叫实例域、实例字段(instance field),或叫成员变量(member variable)。实例的变量,每个实例的变量可能不同。 ...类变量(class variable) ...
  • Eclipse调试修改变量

    千次阅读 2015-03-10 19:19:41
    在开发过程中,我们需要修改某一个变量,来查看返回的结果。我们往往是在代码中将待测试的数据写上,运行,查看结果;将待测试的数据写上,运行,查看结果;......在不知不觉中,花费了很多时间。很久以前总是...
  • Linux中修改环境变量及生效方法如下: 方法一: 在/etc/profile文件中添加变量【对所有用户生效(永久的)】 用vim在文件/etc/profile文件中增加变量,该变量将会对Linux下所有用户有效,并且是“永久的”。 ...
  • 在用Linux(OS:Centos 7.2)时看到有一行代码是:export PYTHONPATH=$PYTHONPATH:/...百度了发现环境变量有三种修改方式。以上属于下述中的第一种。Linux下设置环境变量有三种方法,一种用于当前终端,一种用于当前...
  • Python初始化方法__init__()修改类变量

    千次阅读 2020-11-09 15:42:00
    若初始化,修改类变量,对应类方法也发生改变。 解决方案 修改类变量:类名.属性名 = xxx class A(object): data = 1 def __init__(self, data=2): A.data = data @classmethod def get_data(cls): return cls.data...
  • RedHat中修改环境变量方法

    千次阅读 2015-03-25 11:38:49
    修改环境变量PATH为例,添加/sbin到PATH环境变量中。 (1)如果只是想在本次开机临时性的添加修改,下次开机就无效的话,可以: 输入export PATH=$PATH:/sbin   (2)如果只给当前用户永久添加,则: 在~/....
  • Idea 批量修改变量方法

    千次阅读 2019-12-11 10:03:54
    批量修改变量方法名 在使用Idea时,有时候在建实体时未考虑周全,导致后期需要修改实体的属性名,但是到后期有太多引用,很多set、get等修改变量名比较麻烦。Idea有一个批量修改变量名的方法。 选中要修改的然后按...
  • 文章目录类变量与成员变量1、若类变量与成员同时存在并且同名2、若类变量存在,成员变量不存在,3、若类变量不存在,成员变量存在:类方法与成员方法类方法与静态方法静态方法类方法:下划线 类变量与成员变量 在...
  • 2、类变量类方法就是中的变量方法,必须是静态的,要加static;故其又称静态变量、静态方法。 3、成员变量、成员方法是对象或实例中的变量方法,不加static; 类变量:静态域,静态字段,或叫静态变量,它...
  • Java进阶(四十)Java变量方法修饰符讲解

    万次阅读 多人点赞 2016-08-30 10:00:51
    Java进阶(四十)Java变量方法修饰符讲解Java修饰符 abstract: 将一个声明为抽象,没有实现的方法,需要子类提供方法实现。 final: 将一个生命为最终(即非继承),表示他不能被其他继承。 private:...
  • GetObjectClassGetFieldID,GetStaticFieldIDGet< Type>Field,GetStatic< Type>FieldSet< Type>Field,SetStatic< Type>Field案例介绍:通过JNI获取并修改Java中变量值本文也是基于上面的代码继续添加:...
  • Mac下修改默认PHP环境变量方法

    千次阅读 2019-09-12 15:22:17
    Mac下修改默认PHP环境变量方法 vim ~/.bash_profile 输入你的目标PHP新路径 export PATH="/Applications/MAMP/bin/php/php7.2.8/bin:$PATH" 然后退出并保存,运行一下 .bash_profile 文件 source .bash_...
  • C++如何在const函数修改成员变量

    千次阅读 2018-04-22 17:13:18
    C++如何在const函数修改成员变量在C++,总所周知,c++不允许在const函数直接修改成员变量,想要达到此目的,有两种方式: 使用mutable关键字 造一个假的this去操作成员变量 1.第一种方法很简单,只需要在...
  • js修改scss变量,动态修改scss变量

    万次阅读 热门讨论 2019-08-27 14:50:47
    js修改scss变量,动态修改scss变量 需求,一个页面白天打开是一个风格,晚上打开切换为另一种风格。 之前用的都是写一个list数组,然后数组里面放一些颜色,然后再定义一个下标,通过nth(数组,下标)去拿,例如 $...
  • Linux中修改环境变量及生效方法

    万次阅读 2018-09-12 13:56:47
    修改方法一: export PATH=/usr/local/mongodb/bin:$PATH //配置完后可以通过echo $PATH查看配置结果。 生效方法:立即生效 有效期限:临时改变,只能在当前的终端窗口中有效,当前窗口关闭后就会恢复原有的path配置...
  • //动态链接库中ClsPublic有一变量 private static string key="1111"; //下面通过反射的技术修改和获取 //设置key public static void updatePalmKey(string key = "test") { BindingFlags flag = ...
  • Linux修改环境变量

    千次阅读 2016-12-29 23:33:08
    在Linux中,有许多种修改环境变量方法,下面我们从修改方法,生效方法,有效期限,用户局限几个方面分别介绍一下。 查看PATHecho $PATH 以添加mongodb server为列修改方法一export PATH=/usr/local/mongodb/bin:$...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,513,495
精华内容 605,398
关键字:

修改类变量的值的方法