反射详解 I

一、JAVA反射机制的基本知识点

1、JAVA反射机制是在运行状态中,对于任意一个类 (class文件),都能够知道这个类的所有属性和方法

2、对于任意一个对象,都能够调用它的任意一个方法和属性

3、这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 

4、 动态获取类中信息,就是java反射; 可以理解为对类的解剖

二: Class对象的获取方式

1、一个Class的实例对象代表着一份内存中字节码,就是系统加载其他类到内存中时调用的那一份字节码;

    获取某个类或某个对象所对应的Class对象的常用的3种方式: 

       (1)某个类的实例对象getClass();如String s = “aa”; Class<?> clazz = s.getClass(); 

       (2)Class.forName("该类的完整名称");如:Class.forName("java.lang.String")

       (3)类名.class;如:String.class

   当使用forName()方法时若此类已经被加载过,则直接返回此类的字节码映射;若还没有加载过,则虚拟机会加载这个类到内存中,然后将其字节码的映射地址返回

实体类代码:

public class Student {

	private String name;
	private int age;

	public Student(String name, int age) {
		this.name = name;
		this.age = age;
		System.out.println(this.name + ":" + this.age);
	}
	public Student() {
		System.out.println("Student is demo");
	}
}

2、一个类无论有多少个对象,他们的Class对象同一个,也就是对应同一份字节码文件

public static void main(String[] args) {

		Student s = new Student();
		Class clazz = s.getClass();

		Student s2 = new Student();
		Class clazz2 = s2.getClass();

		System.out.println(clazz == clazz2);
	}

输出结果为:true

很好的验证了:一个类的所有Class对象都是同一个,都对应同一份字节码文件

三:反射获取构造方法

Constructor类:代表了一个类中的一个构造方法

1、有无参构造函数的对象的创建

Class clazz = Class.forName("cn.itcast.bean.Student");
Object obj = clazz.newInstance();

其中通过Class的newInstance()方法建立类对象,改方法调用的是Class类对象所属类默认空参构造函数

2没有无参构造函数的对象的创建

Class clazz = Class.forName("cn.itcast.bean.Student");
Constructor cs = clazz.getConstructor(String.class,int.class);
Object obj = cs.newInstance("Student",20);

Class类对象3种方法可以获取Constructor类对象

[1].  Class类的getConstructors()方法(获取某个类所有公共的构造函数)

[2].  Class类的getDeclaredConstructors()方法(获取某个类所有申明的构造函数)

[3].  Class类的 getConstructor(Class<?>...parameterTypes)方法(获取某个类指定的公共构造函数)

为了说明上面方式的不同,将其中Student类的一个构造方法私有化

public class Student {

	private String name;
	private int age;

	public Student(String name, int age) {
		this.name = name;
		this.age = age;
		System.out.println(this.name + ":" + this.age);
	}

	private Student() {
		System.out.println("Student is demo");
	}
}

测试代码:

1、getConstructors()方法

Class clazz = Class.forName("com.jtt.demo.Student");
		Constructor[] cons = clazz.getConstructors();
		for (Constructor con : cons) {
			System.out.println(con);
		}

输出结果:public com.jtt.demo.Student(java.lang.String,int)

其中:只显示出了公共的有参数构造函数,没有显示出私有的公共函数

2、getDeclaredConstructors()方法

Class clazz = Class.forName("com.jtt.demo.Student");
		Constructor[] cons = clazz.getDeclaredConstructors();
		for (Constructor con : cons) {
			System.out.println(con);
		}

输出结果:

publiccom.jtt.demo.Student(java.lang.String,int)

private com.jtt.demo.Student()

显示出了所有申明构造函数

3、 Class类的 getConstructor(Class<?>...parameterTypes)方法

Class clazz = Class.forName("com.jtt.demo.Student");
		Constructor con = clazz.getConstructor(String.class, int.class);
		Object obj = con.newInstance("lisi", 20);

输出结果:lisi:20

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Python中,反射是指通过字符串的形式去访问对象的属性、方法和其他成员。Python中的每个对象都有一组内置的特殊属性和方法,比如 `__dict__`、`__class__`、`__name__`、`__bases__` 等等。这些属性和方法可以通过反射机制来访问和操作。 Python中的反射通常涉及到以下三个内置函数: 1. `hasattr(object, attribute)`:检查对象是否具有指定的属性或方法。 2. `getattr(object, attribute[, default])`:获取对象的属性或方法。如果属性或方法不存在,则返回默认值(如果指定了)或引发 AttributeError 异常。 3. `setattr(object, attribute, value)`:设置对象的属性或方法。 下面是一些示例: ```python class MyClass: def __init__(self): self.x = 10 def my_method(self): print("Hello, World!") # 创建一个对象 obj = MyClass() # 使用 getattr 获取对象的属性和方法 print(getattr(obj, 'x')) # 输出: 10 getattr(obj, 'my_method')() # 输出: Hello, World! # 使用 hasattr 检查对象是否具有属性和方法 print(hasattr(obj, 'x')) # 输出: True print(hasattr(obj, 'y')) # 输出: False # 使用 setattr 设置对象的属性和方法 setattr(obj, 'y', 20) print(obj.y) # 输出: 20 setattr(obj, 'my_method', lambda: print("Hello, Python!")) obj.my_method() # 输出: Hello, Python! ``` 除了使用内置函数之外,Python中还有另一种反射机制,即使用元类。元类是用于创建类的类,可以通过元类来动态地创建、修改和删除类的属性和方法。元类的使用超出了本文的范围,感兴趣的读者可以自行学习。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值