java-反射

Java如何加载.class文件

Java虚拟机

 

java虚拟机:

抽象化的计算机,通过在实际的计算机上个防真模拟计算机功能来实现的,有自己完善的硬件架构:处理器,堆栈,寄存器等,

还具有相应的指令系统,jvm屏蔽了与具体操作系统平台相关的信息,使得java程序只需要生成在java虚拟机上运行字节码,就可以在不同平台上不加修改的运行,

其中最重要的两点:

JVM内存结构模型,GC jvm是内存中的虚拟机,jvm的存储就是内存,所有写的类,常量,变量,方法都在内存中决定着程序的健壮和高效

 

谈谈反射

Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意犯法和属性;

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

 

 

 

例子

 

Method

newInstance()方法返回的是泛型

getDelaredMethod可以获得该类所有的方法,除去继承和实现了接口的方法

如果是私立的方法,必须使用setAccessible(true)方法

getMethod可以获得该类所有的公有方法,还有所继承的以及实现了接口的方法

Field:

getDeclaredField获取属性

如果是私有属性要设置setAccessible(true)

 

注释以及写的很详细了

 

 

package com.binglian.reflect;

public class Robot {
	
	private String name;
	

	public void sayHi(String helloSentence){
		System.out.println(helloSentence+" "+name);
	}
	
	
	private String throwHello(String tag){
		return "Hello "+tag;
	}
}

 

 

package com.binglian.reflect;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class ReflectSample {

	
	public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException, NoSuchFieldException{
		
		
		Class rc=Class.forName("com.binglian.reflect.Robot");
		Robot r=(Robot)rc.newInstance();
		System.out.println("Class name is "+rc.getName());	//输出Class name is com.binglian.reflect.Robot
		Method getHello=rc.getDeclaredMethod("throwHello", String.class);//调用rc的throwHello这个方法给Method
		getHello.setAccessible(true);//设置为true 如果不设置为true 会报错 因为这个throwHello这个方法是私立的
	
		
		Object str=getHello.invoke(r, "Bob");			 //getHello调用了throwHello的方法 并把Bob字符串传进去
		System.out.println("getHello result is "+str);	 //传进去输出getHello result is Hello Bob
		
		
		//因为这里name没有值 所以为null
		Method sayHi=rc.getMethod("sayHi", String.class);
		sayHi.invoke(r, "Welcome");
		
		
		Field name=rc.getDeclaredField("name");//获取name这个属性 getDeclaredField是获取属性
		name.setAccessible(true);//私有的属性
		name.set(r, "Alice");
		sayHi.invoke(r, "Welcome");//调用sayHi的方法并把Welcome 放入进去
	}
}

 

 

类从编译到执行的过程

 

编译器将Robot.java 源文件编译为Robot.class字节码文件

ClassLoader将字节码转换为JVM中的Class<Robot>对象

JVM利用Class<Robot>对象

 

谈谈Classloder

ClassLoder 在java中有着非常重要的作用,它主要工作在Class装载的加载阶段,其主要作用是从系统外部获得Class二进制数据流,它是java的核心组件,所有的Class都是由ClassLoader进行加载的,ClassLoader 负责通过将Class文件里的二进制数据流装载系统,然后交给Java虚拟机进行连接、初始化等操作

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值