欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

黑马程序员--Java加强--高新技术,黑马--java

来源: javaer 分享于  点击 35263 次 点评:62

黑马程序员--Java加强--高新技术,黑马--java


---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ---------------------

-ide:-->itegrity development environment 集成开发环境

jms:Java消息服务 Java Message Service
jmx:Java 管理扩展 Java Management Extensions
jndi:是 Java 命名与目录接口(Java Naming and Directory Interface
每个类最好做好包名。
静态导入:import 语句可以导入一个类或者某个包中的所有类
          import static 语句导入一个类中的某个静态方法或所有静态方法。(1.5新特性)
可变参数:一个接受的参数个数不固定时,我们可以使用可变参数:特点:只能出现在参数列表的最后,... 位于变量类型和变量名之间,前后有无空格都可以,调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数。
例如 int add(int x int ...args)
{
int sum=x;
for(int i=0;i<args.length;i++)
{
sum+=args[i];
}
return sum;
}
overload:重载
override:重写
增强for循环:for(type 变量名:集合变量名){...}
注意事项:迭代变量必须在()中定义!集合变量可以是数组或实现了Iterable接口的集合类。
基本数据类型的自动装箱与拆箱(1.5特性)
Integer iobj=3;自动装箱过程。如果在(-128~127直接的数据,装箱会同一个对象。享元模式)
Integer i1=12;            Integer i1=129;        
Integer i2=12 i1==i2 true Integer i2=129; i1==i2 false
System.out.println(iobj+12); 自动拆箱过程。
枚举:就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则编译器就会报错。枚举可以让编译器在编译时就可以控制源程序中的填写的非法值,普通变量的方式在开发阶段无法实现这一目标。
枚举只有一个对象时,就是单例设计模式。
反射:基石->Class(注意是大写C)Class类描述了类的名字,类的访问属性,类属于的包名,子段名称的列表,方法名称列表等。
Class.forName()的作用:返回字节码。
获取字节码的方法:类名.class  对象.getClass()  Class.forName("类名")
数组的实例对象为:Class.isArray();
反射就是把Java类中的各种成分映射成相应的java类。
Constructor类:代表某个类中的一个构造方法。
Method类:代表某个类中的一个成员方法。
用反射方式执行某个类中的main方法。
反射的作用:也就是实现框架。
内省:IntroSpector-->对JavaBean(特殊的Java类)操作。;例如 int getAge(); int void setAge();
注解:注解相当于一种标记,加了注解就等于为程序打上了某种标记,在javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有何种标记,看你有什么标记,就去干相应的事,标记可以加在包,类,字段,方法,方法参数以及局部变量上。java.lang包中,可以看到JDK提供的最基本的annotation

注解类:@interface A   应用注解类的类 : @A Class  B

反射练习的代码:

public class ReflectTest {
	public static void main(String[] args) throws Exception{
		// TODO Auto-generated method stub
		String str1="abc";
		Class cls1=str1.getClass();
		Class cls2=String.class;
		Class cls3=Class.forName("java.lang.String");
		System.out.println(cls1==cls2);
		System.out.println(cls2==cls3);
		
        System.out.println(cls1.isPrimitive());//是否为基本类型。
        
        System.out.println(int.class.isPrimitive());
        System.out.println(int.class==Integer.class);
        System.out.println(int.class==Integer.TYPE);//TYPE 封装基本数据类型
	
      Constructor con= String.class.getConstructor(StringBuffer.class);
	  String str=(String)con.newInstance(new StringBuffer("abc'"));
	  System.out.println(str.charAt(2));
	  
	 ReflectPoint pt1=new ReflectPoint(3,5);
	  Field  fieldY=pt1.getClass().getField("y");
	  System.out.println(fieldY.get(pt1));
	  Field  fieldX=pt1.getClass().getDeclaredField("x");//因为定义为私有的。
	  fieldX.setAccessible(true);//暴露反射。
	  System.out.println(fieldX.get(pt1));
	  
	  
	  changeStringValue(pt1);
	  System.out.println(pt1);
	  
	  Method methodCharAt=String.class.getMethod("charAt",int.class);
	  System.out.print(methodCharAt.invoke(str1, 1));//使用CharAt获取字符串的1位置的数据。
	  System.out.print(methodCharAt.invoke(str1, new Object[]{2}));
	  
	  String startingClassName=args[0];
	  Method mainMethod=Class.forName(startingClassName).getMethod("main",String[].class);
	  mainMethod.invoke(null,new Object[]{new String[]{"111","222","333"}});//main主函数只接收一个数组,所以将他们封装成一个Object。
	  mainMethod.invoke(null, (Object)new String[]{"111","222","333"});//此方法也适用。
	  
	  int [] a1=new int []{1,2,3};
	  int [] a2=new int [4];
	  int [][] a3=new int [2][3];
	  String [] a4=new String[]{"a","b","c"};
	  System.out.println(a1.getClass()==a2.getClass());
	  //System.out.println(a1.getClass()==a3.getClass());
	//  System.out.println(a1.getClass()==a4.getClass());//编译的时候就通不过去。
	  
	  System.out.println(a1.getClass().getSuperclass().getName());
	  System.out.println(a4.getClass().getSuperclass().getName());
	  
	  Object aObj1=a1;
	  Object aObj2=a4;
	//  Object [] aObj3=a1;这里是int 不属于Object,
	  Object [] aObj4=a3;//二维数组属于Object类。
	  Object []  aObj5=a4;
	  
	  System.out.println(a1);
	  System.out.println(a4);
	  System.out.println(Arrays.asList(a1));//数字不能打印出来
	  System.out.println(Arrays.asList(a4));//字符串可以打印出来。
	  
	  Object obj=null;
	  printObject(a4);
	  printObject("xyz");
	}
	private static void printObject(Object obj){
		Class clazz=obj.getClass();
		if(clazz.isArray()){
			int len=Array.getLength(obj);
				for(int i=0;i<len;i++){
					System.out.println(Array.get(obj,i));
				}
			}else{
				System.out.println(obj);
			}
		}

	
	private static void changeStringValue(Object obj)throws Exception{
			Field[] fields=obj.getClass().getFields();
			for(Field field:fields){
				//if(field.getType().equals(String.class))
				if(field.getType()==String.class){  //因为是同一份字节码,用双等号。
					String oldValue=(String)field.get(obj);
					String newValue =oldValue.replace('b','a');
					field.set(obj,newValue);
				}
			}
				
	}

}
class TestArguments{
	public static void main(String[] args)
	{
		for(String arg:args)
		{
			System.out.println(arg);
		}
		
	}
}




---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------

相关文章

    暂无相关文章
相关栏目:

用户点评