Java基础篇-Arrays.asList()、反射

1.Arrays.asList()

import java.util.*;
/*
 * Arrays.asList:底层还是数组,只是显示数据方式为list形式,如果后面加add方法会报错
 * 如果真想转换还是得用new ArrayList<>(Arrays.asList(MyStrArray))
 */
public class TestArr {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
String[] str=new String[]{"aa","bb","cc","ff","gg","hh","l","m"};
List<String> alstr=Arrays.asList(str);
//alstr.add("dd")会报错
List<String> finalist=new ArrayList<>(alstr);
finalist.add("dd");
Iterator<String> aa=finalist.iterator();
while(aa.hasNext())
{
	if(aa.next().equals("bb"))
		aa.remove();
}
System.out.println(finalist.toString());
finalist.add("ee");
for(int i=0;i<finalist.size();i++)
{

	if(finalist.get(i).equals("dd"))
		finalist.remove(i);
	if(finalist.get(i).equals("ee"))
		finalist.remove("ee");
}
//foreach迭代删除会报错
for(String ad:finalist)
{
	//去掉下面注释均会报错
	//if(ad.equals("gg")) finalist.remove(ad);
	//if(ad.equals("gg")) finalist.remove("gg");
		
}

System.out.println(finalist.toString());


	}

}

2.反射
(1)使用class.forName会使得静态代码块执行,静态方法不执行

public class TestReflect2 {
public static void main(String[] args) throws ClassNotFoundException{
Class<?> aclass=Class.forName("com.arraytest.ParentStatic");}
}
执行效果:
静态代码块

(2)

public class ParentStatic {
private String name="zhangsan";
static
{
	System.out.println("静态代码块");
}
static void say()
{
	System.out.println("static method say");
	
}
public String manusay(String s)
{
	System.out.println("public method say");
	return "public  say"+s;
}
private void privatesay() {
    System.out.println(name+" private method say");
}
}

(3)反射修改变量,执行私有公有方法

public class TestReflect {

	public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchFieldException {
		// TODO Auto-generated method stub

Class<?> aclass=Class.forName("com.arraytest.ParentStatic");
ParentStatic ainstance=(ParentStatic)aclass.newInstance();
ainstance.say();
/*
 * 公有方法
 */
Method getmethod= aclass.getDeclaredMethod("manusay", String.class);
getmethod.invoke(ainstance, "ZZH");
//打印出返回值
System.out.println(getmethod.invoke(ainstance, "ZZH"));
/*
 *设置变量 
 */
Field field = aclass.getDeclaredField("name");
//为了对类中的参数进行修改我们取消安全检查
field.setAccessible(true);
field.set(ainstance, "李四");


/*
 * 私有方法
 *注意私有方法不能带有void.class
Method bmethod= aclass.getDeclaredMethod("privatesay",void.class);
 */

Method bmethod= aclass.getDeclaredMethod("privatesay");
bmethod.setAccessible(true);
bmethod.invoke(ainstance);

	}

}

4.JDK 动态代理只能只能代理实现了接口的类或者直接代理接口,而 CGLIB 可以代理未实现任何接口的类。 另外, CGLIB 动态代理是通过生成一个被代理类的子类来拦截被代理类的方法调用,因此不能代理声明为 final 类型的类和方法。
就二者的效率来说,大部分情况都是 JDK 动态代理更优秀,随着 JDK 版本的升级,这个优势更加明显。

5.参考https://gitee.com/SnailClimb/JavaGuide/blob/master/docs/java/basis/%E4%BB%A3%E7%90%86%E6%A8%A1%E5%BC%8F%E8%AF%A6%E8%A7%A3.md
6.代码
https://wwa.lanzoui.com/iAnXUqh4noj

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值