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