JAVA 2022.8.9课程总结(反射,JVM)

一、反射

package com.easy22;

import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.io.Serializable;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Arrays;
import java.util.Date;

public class Easy {
	//class类用来描述类是怎样定义的
	//每一个类都具有自己的类对象(Class的对象),这个类对象用来描述该类是怎样定义的
	//可以通过某个类的类对象,动态的获取和调用类中声明的属性和方法
	//如果需要动态的获取某个类的属性和方法,就必须获得该类的类对象
	
	public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, 
	SecurityException, InstantiationException, IllegalAccessException, NoSuchMethodException, 
		IllegalArgumentException, InvocationTargetException, IntrospectionException {
		//获取类对象的方式有三种
		Class clazz=Demo.class; //多数用来测试
		
		clazz=new Demo().getClass();
		
		clazz=Class.forName("com.easy22.Demo");
		
		//获取一个类中定义的属性
		//getField("属性名字");  获取一个指定名字的public定义的属性
		Field f1=clazz.getField("name");
		//getFields 获取所有public定义的属性
		Field[] f_arr=clazz.getFields();
		
		//获取所有定义的属性包含private
		//反射会破坏封装性
		f1=clazz.getDeclaredField("weight");
		f_arr=clazz.getDeclaredFields();
		
		//通过反射实例化一个对象
		//new Object()   newInstance()  必须有可访问的空构造方法
		Object obj=clazz.newInstance();
		//设置属性可访问
		f1.setAccessible(true);
		//给对象注入属性值
		f1.set(obj, 81); 
		//获取属性值
		//f1.get(obj);
		
		System.out.println(obj);
		
		//获取方法
		//方法重载  一个类中方法名一样
		Method m1=clazz.getMethod("test1",String.class,Date.class);
		//通过方法对象驱动一个对象执行该方法 invoke调用
		m1.invoke(obj,"你好",null);
		//获取所有的私有方法
		Method[] m_arr=clazz.getDeclaredMethods();
		//获取所有的构造方法
		//clazz.getConstructor();
		//获取无参的构造方法
		//通过参数列表获取构造方法
		Constructor con=clazz.getDeclaredConstructor();
		//通过构造方法实例化对象
		con.newInstance();
		//获取该类对象继承的父类
		Class su=clazz.getSuperclass();
		System.out.println(su);
		//获取该类对象的实现的接口
		Class[] c_arr=clazz.getInterfaces();
		System.out.println(Arrays.toString(c_arr));
		
		int m=f1.getModifiers();
		boolean b=Modifier.isPublic(m);
		System.out.println(b);
		b=Modifier.isPrivate(m);
		System.out.println(b);
		b=Modifier.isStatic(m);
		System.out.println(b);
		//内省 获得BeanInfo对象  针对JavaBean的操作
		BeanInfo bi=Introspector.getBeanInfo(clazz);
		//获取属性的介绍
		PropertyDescriptor[] ppd_arr=bi.getPropertyDescriptors();
		System.out.println(ppd_arr[0].getName());
		//set方法(写的方法)
		ppd_arr[0].getWriteMethod().invoke(obj,18);
		System.out.println(obj);	
	}
}
class Demo extends Easy implements Serializable,Cloneable{
	public String name;
	public int age;
	private  double weight;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public double getWeight() {
		return weight;
	}
	public void setWeight(double weight) {
		this.weight = weight;
	}
	public void test1(String str,Date date) {
		System.out.println("test1 method"+weight+str+date);
	}
	@Override
	public String toString() {
		return "Demo [name=" + name + ", age=" + age + ", weight=" + weight + "]";
	}
}

二、JVM

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值