java反射机制简单介绍

java反射机制简单介绍

1.字节码。所谓的字节码就是当java虚拟机载入某个类的对象时,首先须要将硬盘中该类的源码编译成class文件的二进制代码(字节码),然后将class文件的字节码载入到内存中,之后再创建该类的对象


2.java反射的基础是Class类(注意不是小写的class),Class类实例代表着内存中的一份字节码。常见的获取Class类对象的方法例如以下(第一种为对象的方法,另外一种为类的方法):

Dog dog = new Dog();
Class dogClass = dog.getClass();
Class dogClass = Class.forName("Dog");
Class dogClass = Dog.class;


3.
获取反射的构造函数
。有了主要的Class类,要获取类的对象,首先要获取类的构造函数,这里主要使用的是Class类的getConstructor方法,例如以下所看到的:

		//使用StringBuffer来构造String对象
		String str1 = new String(new StringBuffer("hello"));
		//获取String类对应的构造函数对象
		Constructor c1 = String.class.getConstructor(StringBuffer.class);
		//错误,这里的參数类型必须和获取构造函数时的參数类型(及StringBuffer.class)一致
		String str2 = (String)c1.newInstance(new String("world"));
		//正确
		String str3 = (String)c1.newInstance(new StringBuffer("world"));
		System.out.println(str3);

4.获取反射的字段。

import java.lang.reflect.Field;

class Point{
	public int x;//这里是public
	private int y;//注意这里是private
	Point(int x,int y){
		this.x = x;
		this.y = y;
	}
}

public class ReflectTest {

	public static void main(String[] args) throws Exception {
		Point p = new Point(2,3);
		//getField仅仅能获得public的字段
		Field fieldX = p.getClass().getField("x");
		//获取x的值
		System.out.println(fieldX.get(p));
		//getDeclaredField能够获取全部字段
		Field fieldY = p.getClass().getDeclaredField("y");
		//设置y的属性
		fieldY.setAccessible(true);
		System.out.println(fieldY.get(p));		
	}

}


5.获取反射的方法。

	public static void main(String[] args) throws Exception {
		String s1 = "hello";
		//參数为函数名,函数的參数(可变长)
		Method m = s1.getClass().getMethod("charAt", int.class);
		//參数为要调用的对象,以及函数的參数。这里假设第一个參数为null,表示调用的是类的静态方法
		System.out.println(m.invoke(s1, 1));
	}


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/119179.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • idea2022.01.12密钥激活码[最新免费获取]

    (idea2022.01.12密钥激活码)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年4月1日
    938
  • 搭建Android开发环境(超详细)

    搭建Android开发环境(超详细)文章转自:http://www.cnblogs.com/xdp-gacl/p/4322165.html搭建最新版本的Android开发环境  最近由于工作中要负责开发一款Android的App,之前都是做JavaWeb的开发,Android开发虽然有所了解,但是一直没有搭建开发环境去学习,Android的更新速度比较快了,Android1.0是2008年发布的,截止到目前为止And

    2022年7月23日
    6
  • java是前端还是后端 对于java来讲那个以后发展的会更好

    java是前端还是后端 对于java来讲那个以后发展的会更好Java和前端很多的初学者都不知道该怎么去选择。本来对于java区分前端还是后端这个问题问的其实并没有什么技术含量,java本身来讲涉及的后端的知识要远远多于前端,当然java也有前端的知识javaweb就是啦,但是个人感觉如果你想学习java还是后端更好。第一后端就像一棵大树,你沿着一根树枝,可以慢慢地了解整个企业应用开发技术这个大树,而你的技术水平会越来越深入。第二前端一直以来就是界面,技术深度不够,随着你经验的丰富,你的技术水平会越来越熟练。所以前端和后端在技术上的区别就是一个趋向熟练,一个趋

    2022年7月8日
    19
  • CodeForces 191C 树链剖分 第4遍「建议收藏」

    CodeForces 191C 树链剖分 第4遍

    2022年1月26日
    50
  • elasticsearch 使用过程中经常遇到的问题

    elasticsearch 使用过程中经常遇到的问题

    2022年2月20日
    48
  • pytest的使用_子程序调用次数不管用

    pytest的使用_子程序调用次数不管用Pytest执行用例规则Pytest在命令行中支持多种方式来运行和选择测试用例1.对某个目录下所有的用例pytest2.对模块中进行测试pytesttest_mod.py3.对文件夹进行

    2022年7月28日
    8

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号