Log4j、装箱拆箱、反射
一,log4j
1, Log4j三个重要组件:日志信息的优先级、日志信息的输出目的地、日志信息的输出格式
2, log4j日志优先级从高到低:error、warn、info、debug
log4j的核心原则是:只有大于或等于在log4j中定义的日志信息级别的日志请求才能被打印出来
3, log4j日志信息输出源:控制台(console)、文件(file)、图形组件(GUI)
每一个输出源就是一个Appender,分别对应的是:ConsoleAppender、FileAppender
DailyRollingFileAppender:将日志信息输出到按日期区分的多个文件中,每个log文件只记录当天的log信息
4, log4j日志信息输出格式:
a) PatternLayout(常用):灵活指定布局模式,必须配置layout.ConversionPattern
b) HTMLLayout:以HTML表格形式布局
5, log4j的优点:
a) 可以设定log信息的输出目的地
b) 可以定义每一条日志信息的级别
c) 有利于系统的规划
6, 使用log4j记录日志
第一步:导入log4j.jar包
第二步:配置log4j.properties文件
###将日志信息输出到控制台###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}%m%n
###把日志信息输出到文件中###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=sysInfo.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}%m%n %l
###设置日志的优先级别###
log4j.rootLogger=debug,stdout.file
第三步:在程序中log4j记录日志信息
public class Demo {
public static void main(String args[]){
Logger logger = null;
try
{
//加载指定位置的日志配置文件
PropertyConfigurator.configure("d:/log4j.properties");
//获取日志记录器
logger = Logger.getLogger(Log4jDemo.class.getName());
int result = 4 / 0;
}catch(Exception e)
{
//输出日志信息
logger.debug(e.getMessage());
}
}
}
二,装箱与拆箱
包装类:把原始数据类型封装称对象的类
装箱:将原始数据类型封装成包装类的过程
拆箱:从包装类中取出相应的原始值的过程
装箱:
Integer integer = new Integer(20); //手动装箱,JDK5版本之前
Integer integer=9; //自动装箱,JDK5版本之后
拆箱:
Integer integer = new Integer(20);
int num= integer.intValue(); //手工拆箱,JDK5版本之前
int num2 = integer; //自动拆箱,JDK5版本之后
注意:自动装箱、自动拆箱是指基本数据类型与其对应的包装类间的自动转换。
例如:不能把5自动装箱成Float类,只能自动装箱成为Integer类
三,反射
1, 定义:反射是指程序在运行时能够获取自身信息的机制
2, java.lang.Class类代表了Java应用程序在运行时所加载的类或接口的实例。每加载一个类,JVM将为其自动生成一个Class对象
3, 通过Object类的getClass()方法或Class.forName()方法获取每个类对应的Class对象。然后通过Class对象获取类的基本信息
4, Class类的方法
方法 |
描述 |
getName |
获取当前类的名称 |
getSuperClass |
获取当前类的父类 |
getConstructors |
获取当前类中全部的构造方法 |
getMethods |
获取当前类中所有方法的集合 |
getMethod |
根据提供的方法名获取对应的Method对象 |
getDeclaredFields |
获取当前类中所有定义的属性 |
getInterfaces |
获取当前类所实现的全部接口 |
getPackage |
获取当前类所属的包 |
eg:
package xcl.T2;
public class Student {
public void sayHello()
{
System.out.println("欢迎");
}
public void showName(String name)
{
System.out.println("我的名字是:"+name);
}
}
public static void main(String[] args) {
try
{
//自动加载类,获取Class对象
Class c=Class.forName("xcl.T2.Student"); System.out.println(c.getName());
System.out.println(c.getSuperclass().getName());
System.out.println(c.isArray());
System.out.println(c.getMethods().length);
//用Class对象的newInstance()方法实例化对象
Student stu=(Student)c.newInstance();
stu.sayHello();//调方法
}catch(ClassNotFoundException e)
{
e.printStackTrace();
}catch(InstantiationException ex)
{
ex.printStackTrace();
}catch(IllegalAccessException ie)
{
ie.printStackTrace();
}
}
通过反射调用类中的方法:
1,通过Class类的getMethod()方法取得Method对象
2,调用Method对象invoke()方法,并向该方法传递参数
案例:
public static void main(String[] args) {
try {
//动态加载Student类,获取Class对象
Class c=Class.forName("xcl.T2.Student");
//获得Student类中名称为sayHello的方法,该方法没有参数
Method method1=c.getMethod("sayHello");
//调用sayHello方法
method1.invoke(c.newInstance());
//调用带参数的方法
//获取类中叫showName的方法,第二个参数是该方法的参数类型列表
Method method=c.getMethod("showName", new Class[]{String.class});
//调用showName方法,第二个参数是为方法传递的参数值列表
method.invoke(c.newInstance(), new Object[]{"xcl"});
} catch (Exception e) {
e.printStackTrace();
}
}
一,