Java23

Java23

关于反射—reflect:

耦合度:多个模块之间的关联或者依赖关系;

而反射就可以降低模块之间的耦合度;

反射用于解析类,解析找到字节码对象以产生实例对象的过程;

字节码对象—也就是 class对象

反射的缺点:—(也是反射的强大之处)

1、打破封装原则;

2、跳过泛型的类型检测;

Class-----代表类的类------代表字节码文件的类;

Field-----代表属性的类;

Method ---- 代表方法的类;

Construct----代表构造方法的类

Annoctatoion—代表包的类

Package–代表包的类,

获取字节码对象的方式:

第一种

获取字节码对象

public static void main(String[] args){

// 通过类名.class;

//获取String的字节码对象;
Class<String> str  =String.class;

System.out.println(str);

//获取List接口的字节码对象;
Class<List> ls = List.class;

System.out.println(ls);
//获取基本类型的字节码对象
Class in = int.class;


}

第二种方式

public static void main(String[] args){


//对象.getClass;


String str = "abc";

Class<String> st = (Class<String>)str.getClass;

System.out.println(st);


Integer in = 12;

Class<Integer> in1=(Class<Integer>)in.Class();

System.out.println(in1);


}

第三种方法

public static void main(String[] args){



//类和对象都获取不到的时候

//Class.forName(字符串形式的全路径名称);--即可获取对应的字节码对象;

Class cl =  Class.forName("java.util.Date");


System.out.println(cl);



}







public static void main(String[] args){

//先获取String的字节码对象

Class<String>= str = String.class;

//获取实例对象

//newInstance()----就是默认在调用类的无参构造;

String st = str.newInstance();



//通过字节码对象调用String类的有参构造

Construction c =  str.getConstruction(char[].class);//传入构造方法的参数类型的字节码对象;

// 获取到的有参构造,调用Instance,传入实际参数,创建实例对象;

String  s = (String)c.newInstance(new char[]{'1','2','3'});


System..out.println(s);

//获取构造方法

Constructor c1 = str.getConstructor(String.class);

String s1 = (String) c1.newInstance("asd");


System.out.println(s1);


通过Integer的全路径名获取Integer的实例对象并赋值

Class<Integer>in1 = (Class<Integer>);

  Class.forName("java.lang.Integer");


Integer inn = (Integer)in1.newInstance(12);

System.out.println(inn);


}

public static void main(String[] args){


Class<String> clz = String.class;

//获取默认构造方法的方式

clz.getDeclaredConstructor(char[].class,boolean.class);


//暴力破解--可以操作特殊的构造方法;
c.setAccessible(true);

//传参
String str = (String)c.newInstance(new char[]{'1'},true);

System.out.println(str);


//获取类中的所有构造方法;

/*Constructor[] sc =clz.getDeclaredCinstructors();

for(Constructor Constructor:cs){

System.out.println(Constructor);*/
}

}


public static void main(String args[]){


//String字节码对象
//获取

Class<Sting> clz = String.class;

//获取指定的属性--hash

Field f = clz.getDeclaredField("hash");


//暴力破解

f.setAccessible(true);

//字符串对象----属性;

String str = "asd";

//给对象的属性赋值---给Str对象的hash属性赋值为456;

f.set(srt,456);

//取值--获取str队形hash属性的值;

System.println(f.get(str));


}


public static void main(String[] args){

Class<String> clz = String.class;


Method m = clz.getDeclaredMetod("charAt",int.class);


String s = "adad";

//通过 .invoke调用方法;

char c = (char)m.invoke(s,3);

System.out.println(c);

}

关于注解

可以自定义注解,如下:

@interface First{
//默认被public static final修饰	
	int i=10;
//声明属性	,不赋值的方式
	double d();
//	支持的属性类型--基本数据类型,String,class
//	annotation、enum、一维数组
}


关于元注解---用于控制、限制注解的使用情况;

@Target---控制注解可以在什么位置使用

@Ratation

关於单例设计模式

简单举例三个

直接生产本类对象

class TaskManager{
	
//	构造方法私有化
//	饥饿式实现方式
private TaskManager	(){
	
}
//创建对象
private   static final  TaskManager	tm = new TaskManager();
//给外界获取的方法
public static TaskManager  getInstance(){
	
//	把唯一 一个对象进行返回;
	return tm;
}



}

需要调用对象时才生成对应的对象,但是会存在多线程并发安全的问题;

class TaskManager{
	
//	构造方法私有化
//	懒汉式实现方式
private TaskManager	(){
	
}
//创建对象
private   static  TaskManager	tm = null;
//给外界获取的方法
public static TaskManager  getInstance(){
	
//判断对象是否为null;
	if(tm==null){
		tm = new TaskManager();
		
	}
	return tm;
}

}

//枚举实现方式,优点是可以防止反射破坏

enum TaskManager{

tm;

}

关于JVM参数

栈:用于计算的 是被线程单独使用

堆:存储的是对象 是被所有线程共享的

方法区:原名永久代 方法区挪到堆里 存储的是类的所有信息 被
所有线程共享

本地方法栈:用于计算的本地方法 被线程单独使用

PC计数器:用于存储计算机/程序的指令以及调度 被线程单独使用
-X 参数—标准参数
-Xxxx 参数—非标准参数
-XXxxx 参数—扩展参数
-Xss128K—指定的是栈内存的大小
-Xmx—对的最大内存大小
-XX:+PrintGCDetails—指明GC的执行的详细细节

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章