配置文件={
log4j.rootLogger=info,A
log4j.logger.DBLog=debug,A
##############
#Log for A #
##############
log4j.appender.A=org.apache.log4j.ConsoleAppender
log4j.appender.A.Target=System.out
log4j.appender.A.layout=org.apache.log4j.PatternLayout
log4j.appender.A.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm}|%m|(%C:%L)%n
};
java代码={
public class Log {
public static Logger getDBLogger(){
return dblog = Logger.getLogger("DBLog");
}
}
//调用部分
Log.getDBLogger().debug("mess");
};
mess信息居然在eclipse控制台出来两遍,这是为什么呢?我改如何修改
JAVA 反射机制是Java 被视为动态(或准动态)语言的一个关键性质。这个机制允许程式在运行时通过Reflection APIs 取得任何一个已知名称的class 的内部资讯,包括其modifiers(诸如public, private,static 等等)、superclass(例如Object)、interfaces(例如Cloneable),也包括fields 和methods 的所有资讯, 并在运行时调用任意一个对象的方法;生成动态代理。下面以一段代码来看一下主要的Reflection APIs,代码中有相应的注释。
import java.lang.reflect.Array; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; public class Goods { private String id; private double price; public Goods(){ System.out.println("it is a pen"); } public Goods(String s1,String s2){ System.out.println(s1+"*"+s2); } public String getId() { System.out.println(id); return id; } public void setId(String id) { this.id = id; } public String addName(String str1,String str2){ return str1+str2; } /** * @throws ClassNotFoundException * @throws IllegalAccessException * @throws InstantiationException * @throws NoSuchMethodException * @throws SecurityException * @throws InvocationTargetException * @throws IllegalArgumentException * @throws NoSuchFieldException * @功能描述 * @输入参数 * @反馈值 */ public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException, NoSuchFieldException { // TODO Auto-generated method stub String str = "com.xtlh.sinye.Goods"; Class c = Class.forName(str); Object obj = c.newInstance();//初始化一个Goods的对象 /** * //这里设置属性的值 调用setId()方法,类型用Class[],参数用Object[] */ Method m = c.getMethod("setId",new Class[]{Class.forName("java.lang.String")}); m.invoke(obj,new Object[]{"it's apple"}); System.out.println("---------------------------------"); /** * //这里是里获取属性的值 调用getId()方法 */ m = c.getMethod("getId",new Class[]{}); m.invoke(obj,new Object []{}); System.out.println("---------------------------------"); /** * //获得类中声明的方法 */ Method me[] = c.getDeclaredMethods(); for(int i=0;i<me.length;i++){ System.out.println("method["+i+"]="+me[i].toString()); } System.out.println("---------------------------------"); /** * //模拟 instanceof 操作符 */ boolean b1 = c.isInstance(new Integer(34)); System.out.println("Goods is a instance of Integer ? "+b1); boolean b2 = c.isInstance(new Goods());//这里调用了无参的构造方法 System.out.println("Goods is a instance of Goods ? "+b2); System.out.println("---------------------------------"); /** * //找出类的方法,类的名称,类的方法的参数,类的方法的返回类型 */ Method med[] = c.getDeclaredMethods(); Method med1[] = c.getMethods();//从字面意思可以看出来,这里找到所有的方法,即可以找到继承来的方法等 for(int i=0;i<med.length;i++){ Method mee = med[i]; System.out.println("method # "+i+" name="+mee.getName()); System.out.println("declaring class ="+mee.getDeclaringClass()); //方法的参数类型 Class pvec[] = m.getParameterTypes(); for(int j=0;j<pvec.length;j++){ System.out.println("parameter # "+j+" ="+pvec[j]); } //方法的异常 Class evec[] = m.getExceptionTypes(); for (int j = 0; j < evec.length; j++){ System.out.println("exception #" + j + " " + evec[j]); } //方法的返回类型 System.out.println("return type = " + mee.getReturnType()); } System.out.println("---------------------------------"); /** * //获取类的构造函数 */ Constructor ctorlist[] = c.getDeclaredConstructors(); for(int i=0;i<ctorlist.length;i++){ Constructor cons = ctorlist[i]; System.out.println("Constructor #"+i+" name="+cons.getName()); Class[] consParaType = cons.getParameterTypes();//获得构造函数的参数类型 if(consParaType.length==0){ System.out.println("Constructor have no parameters"); }else{ for(int j=0;j<consParaType.length;j++){ System.out.println("Constructor Parameter type #"+j+" name="+consParaType[j]); } } } System.out.println("---------------------------------"); /** * //获取类的属性 */ Field fieldlist[] = c.getDeclaredFields(); for(int i=0;i<fieldlist.length;i++){ Field field = fieldlist[i]; System.out.println("Filed #"+i+" name="+field.getName());//属性名称 System.out.println("Filed #"+i+" type="+field.getType());//属性类型 int mod = field.getModifiers(); System.out.println("modifiers = " + Modifier.toString(mod));//属性的修饰符 private/public/protected } System.out.println("---------------------------------"); /** * //根据方法的名称来执行方法 */ Class cls = Class.forName("com.xtlh.sinye.Goods"); Class partypes[] = new Class[2]; partypes[0] = String.class;//更多类型 Long.TYPE Integer.TYPE,或者使用Long.class、Integer.class partypes[1] = Class.forName("java.lang.String"); Method meth = cls.getMethod("addName", partypes); Goods goods = new Goods(); Object arglist[] = new Object[2]; arglist[0] = new String("love"); arglist[1] = new String("grape"); Object retobj = meth.invoke(goods, arglist); String retval = (String) retobj; System.out.println(retval); System.out.println("---------------------------------"); /** * 创建对象,根据指定的参数类型找到相应的构造函数并执行它,以创建一个新的对象实例。使用这种方法可以在程序运行时动态地创建对象,而不是在编译的时候创建对象,这一点非常有价值 */ Class clss = Class.forName("com.xtlh.sinye.Goods"); Class partypess[] = new Class[2]; partypess[0] = String.class; partypess[1] = String.class; Constructor ct = clss.getConstructor(partypess); Object arglists[] = new Object[2]; arglists[0] = new String("hello"); arglists[1] = new String("orange"); Object retobjs = ct.newInstance(arglists); System.out.println("---------------------------------"); /** * //改变属性的值 */ Class ccc = Class.forName("com.xtlh.sinye.Goods"); Field fld = ccc.getDeclaredField("price"); Goods goods1 = new Goods(); System.out.println("price = " + goods1.price); fld.setDouble(goods1, 25.0); System.out.println("price = " + goods1.price); System.out.println("---------------------------------"); /** * //简单使用数组,创建了 10 个单位长度的 String 数组,为第 5 个位置的字符串赋了值,最后将这个字符串从数组中取得并打印了出来 */ Class cla = Class.forName("java.lang.String"); Object arr = Array.newInstance(cla, 10); Array.set(arr, 5, "hello Watermelon"); String s = (String) Array.get(arr, 5); System.out.println(s); System.out.println("---------------------------------"); /** * //复杂数组使用,例中创建了一个 5 x 10 x 15 的整型数组,并为处于 [3][5][10] 的元素赋了值为 37。注意,多维数组实际上就是数组的数组,例如,第一个 Array.get 之后,arrobj 是一个 10 x 15 的数组。进而取得其中的一个元素,即长度为 15 的数组,并使用 Array.setInt 为它的第 10 个元素赋值。 注意创建数组时的类型是动态的,在编译时并不知道其类型。 */ int dims[] = new int[]{5, 10, 15}; Object array = Array.newInstance(Integer.TYPE, dims); Object arrobj = Array.get(array, 3); Class cl = arrobj.getClass().getComponentType(); System.out.println(cl); arrobj = Array.get(arrobj, 5); Array.setInt(arrobj, 10, 37); int arrcast[][][] = (int[][][]) array; System.out.println(arrcast[3][5][10]); } }
好久没弄Android了,今天用Android做Html的效果,一般就是圆角问题
有兴趣研究就参考文档吧 Shape文档
今天就先做一些注释,来日有空再补翻译和实例~
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape=[ " rectangle " oval " line " ring " ]> <!-- 圆角 --> <!-- android:radius为角的弧度,值越大角越圆。 --> <corners android:radius="integer" android:topLeftRadius="integer" android:topRightRadius="integer" android:bottomLeftRadius="integer" android:bottomRightRadius="integer" /> <!-- 渐变 --> <!-- android:startColor和android:endColor分别为起始和结束颜色,ndroid:angle是渐变角度,必须为45的整数倍。 --> <!-- 另外渐变默认的模式为android:type="linear",即线性渐变,可以指定渐变为径向渐变,android:type="radial",径向渐变需要指定半径android:gradientRadius="50"。 --> <gradient android:angle="integer" android:centerX="integer" android:centerY="integer" android:centerColor="integer" android:endColor="color" android:gradientRadius="integer" android:startColor="color" android:type=[ " linear " radial " sweep " android:usesLevel=[ " true " false " /> <!-- 内边距 --> <padding android:left="integer" android:top="integer" android:right="integer" android:bottom="integer" /> <size android:width="integer" android:height="integer" /> <solid android:color="color" /> <!-- 描边 如:html中的broder --> <!-- android:width="2dp" 描边的宽度,android:color 描边的颜色。 --> <!-- 我们还可以把描边弄成虚线的形式,设置方式为:android:dashWidth="5dp"--> <!-- 其中android:dashWidth表示'-'这样一个横线的宽度,android:dashGap表示之间隔开的距离 --> <stroke android:width="integer" android:color="color" android:dashWidth="integer" android:dashGap="integer" /> </shape>