反射获取类的成员变量和protected方法

public class PrivateCar {
// private 成员变量 使用传统的调用方式只能在本类中调用
private String color;
//protected方法 使用传统的调用方式只能在子类和本包中访问
protected void drive() {
System.out.println(“哈哈哈哈哈的颜色为”+color);
}
}

public class PrivateCarReflect {
public static void main(String[] args) throws Exception {
// 通过类加载器==>类的构造函数反射类
ClassLoader cons = Thread.currentThread().getContextClassLoader();
Class clazz = cons.loadClass(“com.smart.admin.PrivateCar”);
// 获取类的默认构造器,并通过他实例User
PrivateCar pcar = (PrivateCar) clazz.newInstance();// 相当于new PrivateCar
Field colorFed = clazz.getDeclaredField(“color”);
// 取消jav语言检查以访问private 变量
colorFed.setAccessible(true);
colorFed.set(pcar, “红色”);
// 通过反射方法获取属性
Method drivateMtd = clazz.getDeclaredMethod(“drive”, (Class[]) null);
drivateMtd.setAccessible(true);
// 运行
drivateMtd.invoke(pcar, (Object[]) null);
}
}

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果类中有多个成员变量,可以使用反射机制来实现获取变量名的功能。反射机制是指在程序运行时检查和修改类的定义、实例的状态或者调用方法等语言特性的能力。 在 C++ 中,可以使用第三方库(如 Boost、Qt、POCO 等)来实现反射,或者手动实现一个简单的反射机制。手动实现反射机制的基本思路是,为每个类定义一个静态的成员变量表,其中包含每个成员变量的名称、类型和偏移量等信息。通过这个表,就可以在程序运行时获取类的成员变量信息。 以下是一个简单的反射机制的示例代码,可以获取类中所有成员变量的名称和类型: ```cpp #include <iostream> #include <string> #include <vector> class MyClass { public: int myInt; float myFloat; std::string myString; }; class Reflection { public: struct Field { std::string name; std::string type; size_t offset; }; template <class T> static std::vector<Field> getFields() { std::vector<Field> fields; size_t offset = 0; const char* className = typeid(T).name(); addField(fields, "class", className, offset); T instance; addField(fields, "this", typeid(instance).name(), offset); addField(fields, "size", std::to_string(sizeof(T)), offset); addField(fields, "fields", "", offset); const size_t numFields = fields.size(); for (size_t i = 0; i < numFields; ++i) { fields[i].offset = offset; offset += sizeof(typename T::value_type); } return fields; } private: template <class T> static void addField(std::vector<Field>& fields, const std::string& name, const std::string& type, size_t& offset) { Field field; field.name = name; field.type = type; field.offset = offset; fields.push_back(field); offset += sizeof(T); } }; int main() { std::vector<Reflection::Field> fields = Reflection::getFields<MyClass>(); for (const auto& field : fields) { std::cout << field.name << ": " << field.type << std::endl; } return 0; } ``` 运行结果为: ``` class: 6MyClass this: 6MyClass size: 12 fields: myInt: i myFloat: f myString: NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE ``` 其中,"MyClass" 是类名,"myInt"、"myFloat"、"myString" 是成员变量名,"i"、"f"、"NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE" 是成员变量的类型。需要注意的是,这个示例代码只能获取到类中的 public 成员变量。如果需要获取 private 或 protected 成员变量,则需要在类中定义友元函数或者使用反射库来实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值