• 关于

    动态实例化类

    的搜索结果

问题

ios怎么在运行时,通过一个NSString new一个类

iPhone开发的类都是通过[[ClassName alloc] init];来new一个类,都是编译阶段就处理好的。但是,我有一个需求,就是要根据用户的输入来new几个类。。。要怎么通过获取到的NSString类型的ClassName来初...
a123456678 2019-12-01 20:27:09 796 浏览量 回答数 1

回答

什么是java反射机制?我们又为什么要学它?当程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言。我们认为java并不是动态语言,但是它却有一个非常突出的动态相关机制,俗称:反射。IT行业里这么说,没有反射也就没有框架,现有的框架都是以反射为基础。在实际项目开发中,用的最多的是框架,填的最多的是类,反射这一概念就是将框架和类揉在一起的调和剂。所以,反射才是接触项目开发的敲门砖! 一、Class类什么是Class类?在面向对象的世界里,万事万物皆是对象。而在java语言中,static修饰的东西不是对象,但是它属于类。普通的数据类型不是对象,例如:int a = 5;它不是面向对象,但是它有其包装类 Integer 或者分装类来弥补了它。除了以上两种不是面向对象,其余的包括类也有它的面向对象,类是java.lang.Class的实例化对象(注意Class是大写)。也就是说:Class A{}当我创建了A类,那么类A本身就是一个对象,谁的对象?java.lang.Class的实例对象。那么这个对象又该怎么表示呢?我们先看一下下面这段代码: 1234public class Demo(){F f=new F();}class F{}这里的F的实例化对象就可以用f表达出来。同理F类也是一个实例化对象,Class类的实例化对象。我们可以理解为任何一个类都是Class类的实例化对象,这种实例化对象有三种表示方法: 123456789101112131415public class Demo(){F f=new F();//第一种表达方式Class c1=F.class;//这种表达方式同时也告诉了我们任何一个类都有一个隐含的静态成员变量class//第二种表达方式Class c2=f.getClass();//这种表达方式在已知了该类的对象的情况下通过getClass方法获取//第三种表达方式Class c3 = null;try {c3 = Class.forName("com.text.F");//类的全称} catch (ClassNotFoundException e) {e.printStackTrace();}}class F{}以上三种表达方式,c1,c2,c3都表示了F类的类类型,也就是官方解释的Class Type。那么问题来了: 1System.out.println(c1 == c2)? or System.out.println(c1 == c3)?答案是肯定的,返回值为ture。这表明不论c1 or c2 or c3都代表了F类的类类型,也就是说一个类只可能是Class类的一个实例对象。理解了Class的概念,我们也可以通过类的类类型创建该类的对象实例,用c1 or c2 or c3的newInstance()方法: 12345678910111213Public class Demo1{try {Foo foo = (Foo)c1.newInstance();//foo就表示F类的实例化对象foo.print();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}}class F{void print(){}}这里需要注意的是,c1是F类的类类型,创建出来的就是F类的对象。如果a是A类的类类型,那么创建出来的对象也应该与之对应,属于A类的对象。 二、方法的反射Class类有一个最简单的方法,getName(): 1234567891011public class Demo2 {public static void main(String[] args) {Class c1 = int.class;//int 的类类型Class c2 = String.class;//String类的类类型Class c3 = void.class;System.out.println(c1.getName());System.out.println(c2.getName());System.out.println(c2.getSimpleName());System.out.println(c3.getName());}}本的数据类型以及void关键字都是存在类类型的。 案例: 123456789101112131415161718192021222324252627282930313233public class ClassUtil {public static void printClassMethodMessage(Object obj){//要获取类的信息》》首先我们要获取类的类类型Class c = obj.getClass();//我们知道Object类是一切类的父类,所以我们传递的是哪个子类的对象,c就是该子类的类类型。//接下来我们要获取类的名称System.out.println("类的名称是:"+c.getName());/**我们知道,万事万物都是对象,方法也是对象,是谁的对象呢? 在java里面,方法是Method类的对象*一个成员方法就是一个Method的对象,那么Method就封装了对这个成员 *方法的操作*///如果我们要获得所有的方法,可以用getMethods()方法,这个方法获取的是所有的Public的函数,包括父类继承而来的。如果我们要获取所有该类自己声明的方法,就可以用getDeclaredMethods()方法,这个方法是不问访问权限的。Method[] ms = c.getMethods();//c.getDeclaredMethods()//接下来我们拿到这些方法之后干什么?我们就可以获取这些方法的信息,比如方法的名字。//首先我们要循环遍历这些方法for(int i = 0; i < ms.length;i++){//然后可以得到方法的返回值类型的类类型Class returnType = ms[i].getReturnType();//得到方法的返回值类型的名字System.out.print(returnType.getName()+" ");//得到方法的名称System.out.print(ms[i].getName()+"(");//获取参数类型--->得到的是参数列表的类型的类类型Class[] paramTypes = ms[i].getParameterTypes();for (Class class1 : paramTypes) {System.out.print(class1.getName()+",");}System.out.println(")");}}}总结思路:通过方法的反射得到该类的名称步骤:1.获取该类的类类型2.通过类类型获取类的方法(getMethods())3.循环遍历所获取到的方法4.通过这些方法的getReturnType()得到返回值类型的类类型,又通过该类类型得到返回值类型的名字5.getName()得到方法的名称,getParameterTypes()获取这个方法里面的参数类型的类类型。 三、成员变量的反射首先我们需要认识到成员变量也是对象,是java.lang.reflect.Field类的对象,那么也就是说Field类封装了关于成员变量的操作。既然它封装了成员变量,我们又该如何获取这些成员变量呢?它有这么一个方法: 12345public class ClassUtil {public static void printFieldMessage(Object obj){Class c = obj.getClass();//Field[] fs = c.getFields();}这里的getFields()方法获取的所有的public的成员变量的信息。和方法的反射那里public的成员变量,也有一个获取所有自己声明的成员变量的信息:Field[] fs = c.getDeclaredFields(); 我们得到它之后,可以进行遍历(既然封装了Field的信息,那么我们就可以得到Field类型) 12345678for (Field field : fs) {//得到成员变量的类型的类类型Class fieldType = field.getType();String typeName = fieldType.getName();//得到成员变量的名称String fieldName = field.getName();System.out.println(typeName+" "+fieldName);}四、构造函数的反射不论是方法的反射、成员变量的反射、构造函数的反射,我们只需要知道:要想获取类的信息,首先得获取类的类类型。 12345678910111213141516171819202122public static void printConMessage(Object obj){Class c = obj.getClass();/* 首先构造函数也是对象,是java.lang.Constructor类的对象 也就是java.lang. Constructor中封装了构造函数的信息 和前面说到的一样,它也有两个方法: getConstructors()方法获取所有的public的构造函数 getDeclaredConstructors()方法得到所有的自己声明的构造函数*/ //Constructor[] cs = c.getConstructors();Constructor[] cs = c.getDeclaredConstructors();for (Constructor constructor : cs) {//我们知道构造方法是没有返回值类型的,但是我们可以:System.out.print(constructor.getName()+"(");//获取构造函数的参数列表》》得到的是参数列表的类类型Class[] paramTypes = constructor.getParameterTypes();for (Class class1 : paramTypes) {System.out.print(class1.getName()+",");}System.out.println(")");}}五、Class类的动态加载类如何动态加载一个类呢?首先我们需要区分什么是动态加载?什么是静态加载?我们普遍认为编译时刻加载的类是静态加载类,运行时刻加载的类是动态加载类。我们举一个例子: 123456789101112Class A{Public static void main(String[] args){if("B".equal(args[0])){B b=new B();b.start();}if("C".equal(args[0])){C c=new C();C.start();}}}上面这一段代码,当我们在用eclipse或者myeclipse的时候我们并不关心是否能够通过编译,当我们直接在cmd使用javac访问A.java类的时候,就会抛出问题: 1234567891011121314151617A.java:7:错误:找不到符号B b=new B();符号: 类B位置: 类AA.java:7:错误:找不到符号B b=new B();符号: 类B位置: 类AA.java:12:错误:找不到符号C c=new C();符号: 类C位置: 类AA.java:12:错误:找不到符号C c=new C();符号: 类C位置: 类A4个错误或许我们理所当然的认为这样应该是错,类B根本就不存在。但是如果我们多思考一下,就会发现B一定用吗?不一定。C一定用吗?也不一定。那么好,现在我们就让B类存在 12345Class B{Public static void start(){System.out.print("B...satrt");}}现在我们就先 javac B.class,让B类先开始编译。然后在运行javac A.class。结果是: 123456789A.java:12:错误:找不到符号C c=new C();符号: 类C位置: 类AA.java:12:错误:找不到符号C c=new C();符号: 类C位置: 类A2个错误我们再想,这个程序有什么问题。如果你说没有什么问题?C类本来就不存在啊!那么问题来了B类已经存在了,假设我现在就想用B,我们这个程序用得了吗?答案是肯定的,用不了。那用不了的原因是什么?因为我们这个程序是做的类的静态加载,也就是说new创建对象是静态加载类,在编译时刻就需要加载所有的,可能使用到的类。所以不管你用不用这个类。现在B类是存在的,但是我们这个程序仍然用不了,因为会一直报C类有问题,所以B类我也用不了。那么在实际应用当中,我们肯定需要如果B类存在,B类我就能用,当用C类的时候,你再告诉我错了。如果说将来你有100个类,只要其中一个类出现问题,其它99个类你都用不了。所以这并不是我们想要的。我们想要的就是我用那个类就加载那个类,也就是常说的运行时刻加载,动态加载类。如何实现动态加载类呢?我们可以建这么一个类: 1234567891011Class All{Public static void start(){try{Class cl= Class.forName(args[0]);//通过类类型,创建该类的对象cl.newInstance();}catch(Exception e){e.printStackTrace();}}}前面我们在分析Class实例化对象的方式的时候,Class.forName(“类的全称”),它不仅仅表示了类的类类型,还表示了动态加载类。当我们javac All.java的时候,它不会报任何错误,也就是说在编译的时候是没有错误的。只有当我们具体用某个类的时候,那个类不存在,它才会报错。如果加载的类是B类,就需要: 1B bt = (B) cl.newInstance();万一加载的是C类呢,可以改成 1C ct = (C) cl.newInstance();但是如果我想用很多的类或者加载很多的类,该怎么办?我们可以统一一个标准,不论C类还是B类或者其他的类,比如定义一个标准 1Stand s = (Stand) cl.newInstance();只要B类和C类都是这个标准的就行了。 123456789101112131415Class All{Public static void start(){try{Class cl= Class.forName(args[0]);//通过类类型,创建该类的对象Stand s = (Stand) cl.newInstance();s.start();}catch(Exception e){e.printStackTrace();}}}interface Stand {Public void start();}现在如果我想要用B类,我们只需要: 12345Class B implements Stand{Public void start(){System.out.print("B...satrt");}}加载B类,编译运行。 123javac B.javajavac Stand.javajava Stand B结果: 1B...satrt如果以后想用某一个类,不需要重新编译,只需要实现这个标准的接口即可。只需要动态的加载新的东西就行了。这就是动态加载类。
auto_answer 2019-12-02 01:50:24 0 浏览量 回答数 0

问题

在实例化类时动态选择继承?

class classA:def common(self): print('A') class classB:def common(self): print('B') class classC:def workflow(se...
一码平川MACHEL 2019-12-01 19:34:27 433 浏览量 回答数 3

回答

生命周期:加载和实例化Servlet我们来看一下Tomcat是如何加载的: 1. 如果已配置自动装入选项,则在启动时自动载入。 2. 在服务器启动时,客户机首次向Servlet发出请求。 3. 重新装入Servlet时。 当启动Servlet容器时,容器首先查找一个配置文件web.xml,这个文件中记录了可以提供服务的Servlet。每个Servlet被指定一个Servlet名,也就是这个Servlet实际对应的Java的完整class文件名。Servlet容器会为每个自动装入选项的Servlet创建一个实例。所以,每个Servlet类必须有一个公共的无参数的构造器。 初始化 当Servlet被实例化后,Servlet容器将调用每个Servlet的init方法来实例化每个实例,执行完init方法之后,Servlet处于“已初始化”状态。所以说,一旦Servlet被实例化,那么必将调用init方法。通过Servlet在启动后不立即初始化,而是收到请求后进行。在web.xml文件中用<load-on-statup> ...... </load-on-statup>对Servlet进行预先初始化。 初始化失败后,执行init()方法抛出ServletException异常,Servlet对象将会被垃圾回收器回收,当客户端第一次访问服务器时加载Servlet实现类,创建对象并执行初始化方法。 请求处理 Servlet 被初始化以后,就处于能响应请求的就绪状态。每个对Servlet 的请求由一个Servlet Request 对象代表。Servlet 给客户端的响应由一个Servlet Response对象代表。对于到达客户机的请求,服务器创建特定于请求的一个“请求”对象和一个“响应”对象。调用service方法,这个方法可以调用其他方法来处理请求。 Service方法会在服务器被访问时调用,Servlet对象的生命周期中service方法可能被多次调用,由于web-server启动后,服务器中公开的部分资源将处于网络中,当网络中的不同主机(客户端)并发访问服务器中的同一资源,服务器将开设多个线程处理不同的请求,多线程同时处理同一对象时,有可能出现数据并发访问的错误。 另外注意,多线程难免同时处理同一变量时(如:对同一文件进行写操作),且有读写操作时,必须考虑是否加上同步,同步添加时,不要添加范围过大,有可能使程序变为纯粹的单线程,大大削弱了系统性能;只需要做到多个线程安全的访问相同的对象就可以了。 卸载Servlet 当服务器不再需要Servlet实例或重新装入时,会调用destroy方法,使用这个方法,Servlet可以释放掉所有在init方法申请的资源。一个Servlet实例一旦终止,就不允许再次被调用,只能等待被卸载。 Servlet一旦终止,Servlet实例即可被垃圾回收,处于“卸载”状态,如果Servlet容器被关闭,Servlet也会被卸载,一个Servlet实例只能初始化一次,但可以创建多个相同的Servlet实例。如相同的Servlet可以在根据不同的配置参数连接不同的数据库时创建多个实例。 各个方法:init()方法 在Servlet的生命周期中,仅执行一次init()方法,它是在服务器装入Servlet时执行的,可以配置服务器,以在启动服务器或客户机首次访问Servlet时装入Servlet。无论有多少客户机访问Servlet,都不会重复执行init(); service()方法 它是Servlet的核心,每当一个客户请求一个HttpServlet对象,该对象的Service()方法就要调用,而且传递给这个方法一个“请求”(ServletRequest)对象和一个“响应”(ServletResponse)对象作为参数。在HttpServlet中已存在Service()方法。默认的服务功能是调用与HTTP请求的方法相应的do功能。 destroy()方法 仅执行一次,在服务器端停止且卸载Servlet时执行该方法,有点类似于C++的delete方法。一个Servlet在运行service()方法时可能会产生其他的线程,因此需要确认在调用destroy()方法时,这些线程已经终止或完成。 下面来谈谈Servlet的生命周期,Servlet的生命周期是由Servlet容器来控制的,它始于装入Web服务器的内存时,并在终止或重新装入Servlet时结束。这项操作一般是动态执行的。然而,Server通常会提供一个管理的选项,用于在Server启动时强制装载和初始化特定的Servlet。 在代码中,Servlet生命周期由接口javax.servlet.Servlet定义。所有的Java Servlet 必须直接或间接地实现javax.servlet.Servlet接口,这样才能在Servlet Engine上运行。javax.servlet.Servlet接口定义了一些方法,在Servlet 的生命周期中,这些方法会在特定时间按照一定的顺序被调用。
小川游鱼 2019-12-02 01:50:40 0 浏览量 回答数 0

回答

一、spring 中的概念 ##beanFactory容器1、容器是spring框架的核心,容器使用ioc依赖注入来管理所有组成应用系统的组件。 2、spring中的两种容器: beanFactory 这个容器提供了基础的依赖注入支持,而且是延迟加载的,而 applicationcontext是对beanFactory 这个容器的扩展, 3、beanFactory :beanFactory就是一个Bean工厂,使用了工厂模式,但bean工厂不像一般的工厂,只提供特定类的bean而是一个通用的工厂,可以创建和分发各种类型的bean,beanFactory不仅仅只是创建和分发bean因为我们知道,这个bean工厂知道应用中的很多对象,在创建这些对象的时候,创建出了这些对象之间的关联关系,bean工厂还管理这些对象的生命周期。4、beanFactory 接口的实现类有很多,我们这里就举一个常用的类: XMLBeanFactory, XMLBeanFactory构造方法的参数是一个inputStream对象,而传递进来的就是我们定义bean的xml文件 5、实例:BeanFactory beanfactory = new XMLBeanFactory(newFileInputStream(bean.xml)); 这样beanFactory就获取了配置文件中bean的信息,但是bean是延迟实例化的所以现在只是加载进来了,但还是没有创建实例,只有在使用的时候尽心创建 6、 User user=(User)beanfactory.getBean("user"); 当我们调用getBean()时工厂会实例化并且会依赖注入设置相关属性值。 ApplicationContext 容器 1、applicationcontext和beanFactory看来都是一样的,都是加载bean的信息,配置bean和分发bean,但是application context作为beanFactory的扩展有一些额外的功能:(1)文本信息解析工具,包括对国际化的支持(2)应用上下文提供了载入文件资源的通用方法(3)应用上下文可以向注册为监听器的bean发送事件,因为application context的额外功能所以在应用中大都使用application context而beanFactory在资源较少的移动设备上使用 2、ApplicationContext的实现:ClassPathXmlApplicationContext()类路劲中的xml文件中载入上下文信息,FileSystemXmlApplicationContext()文件系统xml获取上下文信息 XmlWebApplicationContext()从网络获取上下文信息。3、我们知道 ApplicationContext是对beanFactory的扩展所以我们同样可以使用 .getBean("User")来获取对象,但是这里有点不同,那就是在beanFactory中使用的就是懒加载,在调用getBean()的时候才会创建实例而ApplicationContext () 在上下文预加载的时候就创建了实例,在使用的时候不用等待创建而是直接使用。 Spring中bean的周期 1、容器寻找bean的定义信息,并且实例化bean2、使用依赖注入,spring按照bean定义信息配置bean的所有属性3、如果bean实现了BeanNameAware接口则工厂调用bean的setBeanName() 方法传递bean的Id4、如果bean实现了beanFacgtoryAware 接口则工厂调用 setBeanFactory()方法传入工厂本身。5、如果有BeanPostProcess和bean关联那么他们的PostProcessBeforeInitialzation()方法将被调用6、如果bean指定了init-method 方法则将被调用7、如果有BeanPostProcess和bean关联那么他们的PostProcessAfterInitialzation()方法将被调用 到这里bean就可以在系统中被使用了,并将一直保存在BeanFactory 中直到他不在使用。8、删除: spring 中有两种方式:(1)、如果bean实现了Disposable接口则destory方法将会被调用(2)、自己定义定义了销毁方法则执行他 destroy-method 依赖注入 1、所谓依赖注入,即组件之间的依赖关系由容器在运行期决定,形象地说,即由容器动态地将某种依赖关系注入到组件之中。装配在spring容器内拼凑bean叫做装配,装配bean的时候你是在告诉容器需要哪些bean,以及容器如何使用依赖注入将他们配合在一起。 实例化1、在使用spring容器进行bean类的管理的时候,我们获取bean类有两种类型,一种就是在spring中使用了单例模式,获取的都是第一次加载的时候创建的那个bean实例,第二种就是在spring中没有定义单例模式,每获取一次就会产生一个新的bean实例。 区别这两种的配置: <beanid="user" class="com.inspur.User" singleton=off> </bean> // singleton(单一的 唯一的) 这里关闭了单例模式,所以每次获取的bean对象都是新的,而在spring中singleton默认是开着的,因为像数据库连接池,网络资源等创建新对象很浪费资源,所以还是使用单例模式比较好,如果没有特别需求还是使用单例模式比较好!
小旋风柴进 2019-12-02 01:58:02 0 浏览量 回答数 0

回答

你没注意一个关键点 就是人家的例子是带着全部的namespace名字的 use  My \ Full \ Classname  as  Another 你可以改一下你的代码, usemy\box\base;$name='my\box\base';$obj=new$name;var_dump($obj); 这样试一下是否可以回复 @甘薯:哦,我发现好像我理解错了。$obj=newAnother;//实例化一个My\Full\Classname对象$a='Another';$obj=new$a;//实际化一个Another对象第一个和第二个实例化的方式有却别。。谢谢啦!过年好啊回复 @大Q:如果你指定了别名,那么别名才代表着整个的namespace,你看人家的例子不是使用别名来初始化类的...谢谢啦,在$name这里写上完全限定名称是能够找到了,但是usemy\box\baseasbs;倒入别名的话动态名称就不灵了,难道导入动态名称不能使用别名?还是我看手册漏掉了什么?
爱吃鱼的程序员 2020-06-14 17:46:29 0 浏览量 回答数 0

问题

接口怎么在spring中动态调用,解耦

我有一个通信接口IComminicate,具体的实现方法分别有SocketCommunicate 和 WebServiceCommunicate,类的实例化由spring管理问题是我在调用类XXAction里面,采用spring的方法@Re...
a123456678 2019-12-01 20:24:04 1135 浏览量 回答数 1

回答

1 . 静态分派: 所有依赖静态类型来定位方法执行版本的分派动作,都称为静态分派,静态分派的最典型应用就是多态性中的方法重载。静态分派发生在编译阶段,因此确定静态分配的动作实际上不是由虚拟机来执行的。动态分派     动态分派与多态性的另一个重要体现——方法覆写有着很紧密的关系。向上转型后调用子类覆写的方法便是一个很好地说明动态分派的例子。这种情况很常见,因此这里不再用示例程序进行分析。很显然,在判断执行父类中的方法还是子类中覆盖的方法时,如果用静态类型来判断,那么无论怎么进行向上转型,都只会调用父类中的方法,但实际情况是,根据对父类实例化的子类的不同,调用的是不同子类中覆写的方法,很明显,这里是要根据变量的实际类型来分派方法的执行版本的。而实际类型的确定需要在程序运行时才能确定下来,这种在运行期根据实际类型确定方法执行版本的分派过程称为动态分派。
hiekay 2019-12-02 01:42:12 0 浏览量 回答数 0

回答

您可以使用getattr动态获取属性。我相信这里已经回答了这个问题,是从动态导入模块中的类的字符串名称动态实例化吗? import myPythonFile answer = str(input()) if answer == "yes": classToAccess = "classA" else: classToAccess = "classB" myVarible = getattr(myPythonFile, classToAccess).myVarible 回答来源:stackoverflow
is大龙 2020-03-24 21:32:18 0 浏览量 回答数 0

回答

反射是框架设计的灵魂。 在我们平时的项目开发过程中,基本上很少会直接使用到反射机制,但这不能说明反射机制没有用,实际上有很多设计、开发都与反射机制有关,例如模块化的开发,通过反射去调用对应的字节码;动态代理设计模式也采用了反射机制,还有我们日常使用的 Spring/Hibernate 等框架也大量使用到了反射机制。 举例: ①我们在使用JDBC连接数据库时使用Class.forName()通过反射加载数据库的驱动程序; ②Spring框架也用到很多反射机制,最经典的就是xml的配置模式。 Spring 通过 XML 配置模式装载 Bean 的过程:1) 将程序内所有 XML 或 Properties 配置文件加载入内存中; 2)Java类里面解析xml或properties里面的内容,得到对应实体类的字节码字符串以及相关的属性信息; 3)使用反射机制,根据这个字符串获得某个类的Class实例; 4)动态配置实例的属性
剑曼红尘 2020-03-27 16:19:24 0 浏览量 回答数 0

问题

php导入命名空间使用动态名称实例化有意义么??报错

file01.php <?php namespace my\box; class base { public function __construct() { echo __METHOD__.'<br /...
爱吃鱼的程序员 2020-06-14 17:45:51 0 浏览量 回答数 1

回答

首先,我们先来聊聊各类数据模型。下列相关信息参考自Emil Eifrem的博文及NoSQL数据库说明。文档类数据库传承:受Lotus Notes启发而来。数据模型:文档汇总,包括键-值汇总。实例: CouchDB, MongoDB优势: 数据建模自然、程序员易于上手、开发流程短、兼容网页模式、便于达成CRUD(即添加、查询、更新及删除的简称)。图形类数据库传承:来自 Euler 及图形理论。数据模型:节点及关系,二者结合能够保持键-值间的成对状态实例: AllegroGraph, InfoGrid, Neo4j优势:轻松玩转复杂的图形问题、处理速度快关系类数据库传承:源自 E. F. Codd在大型共享数据库中所提出的数据关系模型理论数据模型:以关系组为基础实例: VoltDB, Clustrix, MySQL优势:性能强大、联机事务处理系统扩展性好、支持SQL访问、视图直观、擅长处理交易关系、与程序员间的交互效果优异面向对象类数据库传承:源自图形数据库方面的研究成果数据模型: 对象实例: Objectivity, Gemstone优势:擅长处理复杂的对象模型、快速的键-值访问及键-功能访问并且兼具图形数据库的各类功能键-值存储传承: Amazon Dynamo中的paper概念及分布式hash表数据模型:对成对键-值的全局化汇总实例: Membase, Riak优势:尺寸掌控得当、擅长处理持续的小规模读写需求、速度快、程序员易于上手BigTable Clones传承自:谷歌BigTable中的paper概念数据模型:纵列群,即在某个表格模型中,每行在理论上至少可以有一套单独的纵列配置实例: HBase, Hypertable, Cassandra优势:尺寸掌控得当、擅长应对大规模写入负载、可用性高、支持多数据中心、支持映射简化数据结构类服务传承: 不明实例: Redis数据模型: 执行过程基于索引、列表、集合及字符串值优势:为数据库应用引入前所未有的新鲜血液网格类数据库传承:源自数据网格及元组空间研究数据模型:基于空间的构架实例: GigaSpaces, Coherence优势:优良的性能表现及上佳的交易处理扩展性我们该为自己的应用程序选择哪套方案?选择的关键在于重新思考我们的应用程序如何依据不同数据模型及不同产品进行有针对性的协同工作。即用正确的数据模型处理对应的现实任务、用正确的产品解决对应的现实问题。要探究哪类数据模型能够切实为我们的应用程序提供帮助,可以参考“到底NoSQL能在我们的工作中发挥什么作用?”一文。在这篇文章中,我试着将各种不同特性、不同功能的常用创建系统中的那些非常规的应用实例综合起来。将应用实例中的客观需求与我们的选择联系起来。这样大家就能够逆向分析出我们的基础架构中适合引入哪些产品。至于具体结论是NoSQL还是SQL,这已经不重要了。关注数据模型、产品特性以及自身需要。产品总是将各种不同的功能集中起来,因此我们很难单纯从某一类数据模型构成方式的角度直接找到最合用的那款。对功能及特性的需求存在优先级,只要对这种优先级具备较为清晰的了解,我们就能够做出最佳选择。如果我们的应用程序需要…复杂的交易:因为没人愿意承受数据丢失,或者大家更倾向于一套简单易用的交易编程模式,那么请考虑使用关系类或网格类数据库。例如:一套库存系统可能需要完整的ACID(即数据库事务执行四要素:原子性、一致性、隔离性及持久性)。顾客选中了一件产品却被告知没有库存了,这类情况显然容易引起麻烦。因为大多数时候,我们想要的并不是额外补偿、而只是选中的那件货品。若是以扩展性为优先,那么NoSQL或SQL都能应对自如。这种情况下我们需要关注那些支持向外扩展、分类处理、实时添加及移除设备、负载平衡、自动分类及整理并且容错率较高的系统。要求持续保有数据库写入功能,则需要较高的可用性。在这种情况下不妨关注BigTable类产品,其在一致性方面表现出众。如有大量的小规模持续读写要求,也就是说工作负载处于波动状态,可以关注文档类、键-值类或是那些提供快速内存访问功能的数据库。引入固态硬盘作为存储媒介也是不错的选择。以社交网络为实施重点的话,我们首先想到的就是图形类数据库;其次则是Riak这种关系类数据库。具备简单SQL功能的常驻内存式关系数据库基本上就可以满足小型数据集合的需求。Redis的集合及列表操作也能发挥作用。如果我们的应用程序需要…在访问模式及数据类型多种多样的情况下,文档类数据库比较值得考虑。这类数据库不仅灵活性好,性能表现也可圈可点。需要完备的脱机报告与大型数据集的话,首选产品是Hadoop,其次则是支持映射简化的其它产品。不过仅仅支持映射简化还不足以提供如Hadoop一样上佳的处理能力。如果业务跨越数个数据中心,Bigtable Clone及其它提供分布式选项的产品能够应对由地域距离引起的延迟现象,并具备较好的分区兼容性。要建立CRUD应用程序,首选文档类数据库。这类产品简化了从外部访问复杂数据的过程。需要内置搜索功能的话,推荐Riak。要对数据结构中的诸如列表、集合、队列及发布/订阅信息进行操作,Redis是不二之选。其具备的分布式锁定、覆盖式日志及其它各种功能都会在这类应用状态下大放异彩。将数据以便于处理的形式反馈给程序员(例如以JSON、HTTP、REST、Javascript这类形式),文档类数据库能够满足这类诉求,键-值类数据库效果次之。如果我们的应用程序需要…以直观视图的形式进行同步交易,并且具备实时数据反馈功能,VoltDB算得上一把好手。其数据汇总以及时间窗口化的表现都非常抢眼。若是需要企业级的支持及服务水平协议,我们需要着眼于特殊市场。Membase就是这样一个例子。要记录持续的数据流,却找不到必要的一致性保障?BigTable Clone交出了令人满意的答卷,因为其工作基于分布式文件系统,所以可以应对大量的写入操作。要让操作过程变得尽可能简单,答案一定在托管或平台即服务类方案之中。它们存在的目的正是处理这类要求。要向企业级客户做出推荐?不妨考虑关系类数据库,因为它们的长项就是具备解决繁杂关系问题的技术。如果需要利用动态方式建立对象之间的关系以使其具有动态特性,图形类数据库能帮上大忙。这类产品往往不需要特定的模式及模型,因此可以通过编程逐步建立。S3这类存储服务则是为支持大型媒体信息而生。相比之下NoSQL系统则往往无法处理大型二进制数据块,尽管MongoDB本身具备文件服务功能。如果我们的应用程序需要…有高效批量上传大量数据的需求?我们还是得找点有对应功能的产品。大多数产品都无法胜任,因为它们不支持批量操作。文档类数据库或是键-值类数据库能够利用流畅的模式化系统提供便捷的上传途径,因为这两类产品不仅支持可选区域、添加区域及删除区域,而且无需建立完整的模式迁移框架。要实现完整性限制,就得选择一款支持SQL DLL的产品,并在存储过程或是应用程序代码中加以运行。对于协同工作极为依赖的时候就要选择图形类数据库,因为这类产品支持在不同实体间的迅速切换。数据的移动距离较短且不必经过网络时,可以在预存程序中做出选择。预存程序在关系类、网格类、文档类甚至是键-值类数据库中都能找到。如果我们的应用程序需要…键-值存储体系擅长处理BLOB类数据的缓存及存储问题。缓存可以用于应对网页或复杂对象的存储,这种方案能够降低延迟、并且比起使用关系类数据库来说成本也较低。对于数据安全及工作状态要求较高的话可以尝试使用定制产品,并且在普遍的工作范畴(例如向上扩展、调整、分布式缓存、分区及反规范化等等)之外一定要为扩展性(或其它方面)准备解决方案。多样化的数据类型意味着我们的数据不能简单用表格来管理或是用纵列来划分,其复杂的结构及用户组成(也可能还有其它各种因素)只有文档类、键-值类以及Bigtable Clone这些数据库才能应付。上述各类数据库都具备极为灵活的数据类型处理能力。有时其它业务部门会需要进行快速关系查询,引入这种查询方式可以使我们不必为了偶尔的查看而重建一切信息。任何支持SQL的数据库都能实现这类查询。至于在云平台上运行并自动充分利用云平台的功能——这种美好的愿望目前还只能是愿望。如果我们的应用程序需要…支持辅助索引,以便通过不同的关键词查找数据,这要由关系类数据库及Cassandra推出的新辅助索引系统共同支持才能实现。创建一套处于不断增长中的数据集合(真正天文数量级的数据)然而访问量却并不大,那么Bigtable Clone是最佳选择,因为它会将数据妥善安排在分布式文件系统当中。需要整合其它类型的服务并确保数据库提供延后写入同步功能?那最好的实现方式是捕捉数据库的各种变化并将其反馈到其它系统中以保障运作的一致性。通过容错性检查了解系统对供电中断、隔离及其它故障情况的适应程度。若是当前的某项技术尚无人问津、自己却感觉大有潜力可挖,不妨在这条路上坚持走下去。这种情况有时会带来意料之外的美好前景。尝试在移动平台上工作并关注CouchDB及移动版couchbase。哪种方案更好?25%的状态改善尚不足以让我们下决心选择NoSQL。选择标准是否恰当取决于实际情况。这类标准对你的方案有指导意义吗?如果你的公司尚处于起步阶段,并且需要尽快推出自己的产品,这时不要再犹豫不决了。无论是SQL还是NoSQL都可以作为参考。
a123456678 2019-12-02 03:00:14 0 浏览量 回答数 0

回答

IoC(Inversion of Control) (1). IoC(Inversion of Control)是指容器控制程序对象之间的关系,而不是传统实现中,由程序代码直接操控。控制权由应用代码中转到了外部容器,控制权的转移是所谓反转。 对于Spring而言,就是由Spring来控制对象的生命周期和对象之间的关系;IoC还有另外一个名字——“依赖注入(Dependency Injection)”。从名字上理解,所谓依赖注入,即组件之间的依赖关系由容器在运行期决定,即由容器动态地将某种依赖关系注入到组件之中。 (2). 在Spring的工作方式中,所有的类都会在spring容器中登记,告诉spring这是个什么东西,你需要什么东西,然后spring会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由 spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转。(3). 在系统运行中,动态的向某个对象提供它所需要的其他对象。 (4). 依赖注入的思想是通过反射机制实现的,在实例化一个类时,它通过反射调用类中set方法将事先保存在HashMap中的类属性注入到类中。 总而言之,在传统的对象创建方式中,通常由调用者来创建被调用者的实例,而在Spring中创建被调用者的工作由Spring来完成,然后注入调用者,即所谓的依赖注入or控制反转。 注入方式有两种:依赖注入和设置注入; IoC的优点:降低了组件之间的耦合,降低了业务对象之间替换的复杂性,使之能够灵活的管理对象。AOP(Aspect Oriented Programming)(1). AOP面向方面编程基于IoC,是对OOP的有益补充;(2). AOP利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了 多个类的公共行为封装到一个可重用模块,并将其名为“Aspect”,即方面。所谓“方面”,简单地说,就是将那些与业务无关,却为业务模块所共同调用的 逻辑或责任封装起来,比如日志记录,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。(3). AOP代表的是一个横向的关 系,将“对象”比作一个空心的圆柱体,其中封装的是对象的属性和行为;则面向方面编程的方法,就是将这个圆柱体以切面形式剖开,选择性的提供业务逻辑。而 剖开的切面,也就是所谓的“方面”了。然后它又以巧夺天功的妙手将这些剖开的切面复原,不留痕迹,但完成了效果。(4). 实现AOP的技术,主要分为两大类:一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;二是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码。(5). Spring实现AOP:JDK动态代理和CGLIB代理 JDK动态代理:其代理对象必须是某个接口的实现,它是通过在运行期间创建一个接口的实现类来完成对目标对象的代理;其核心的两个类是InvocationHandler和Proxy。 CGLIB代理:实现原理类似于JDK动态代理,只是它在运行期间生成的代理对象是针对目标类扩展的子类。CGLIB是高效的代码生成包,底层是依靠ASM(开源的java字节码编辑类库)操作字节码实现的,性能比JDK强;需要引入包asm.jar和cglib.jar。 使用AspectJ注入式切面和@AspectJ注解驱动的切面实际上底层也是通过动态代理实现的。(6). AOP使用场景: Authentication 权限检查 Caching 缓存 Context passing 内容传递 Error handling 错误处理 Lazy loading 延迟加载 Debugging  调试 logging, tracing, profiling and monitoring 日志记录,跟踪,优化,校准 Performance optimization 性能优化,效率检查 Persistence  持久化 Resource pooling 资源池 Synchronization 同步 Transactions 事务管理 另外Filter的实现和struts2的拦截器的实现都是AOP思想的体现。
wangccsy 2019-12-02 01:50:38 0 浏览量 回答数 0

回答

你的AOP切面很多吗?能消耗多少服务器资源另外如果使用SpringAOP,项目中的切面如果没有在IOC容器中实例化的话,切面是不起作用的。目前能想到的思路是启动时加载切面,可以通过在某个类中存放一个静态方法来确定是否开启AOP,然后通过jsp页面改变变量值另外可以试试Spring的动态注册Bean的功能看看能不能实现。
小旋风柴进 2019-12-02 01:57:18 0 浏览量 回答数 0

问题

反射---Java高级开发必须懂的?报错

理解反射对学习Java框架有很大的帮助,如Spring框架的核心就是使用Java反射实现的,而且对做一些Java底层的操作会很有帮助。 一、Class类的使用 1、万事万物皆对象,(...
爱吃鱼的程序员 2020-06-08 13:13:13 0 浏览量 回答数 1

问题

php命名空间导入的时候使用动态名称报错。。?报错

如下这段代码: file02.php <?php use my\box\base; $name = 'base'; $obj = new $name; var_dump($o...
爱吃鱼的程序员 2020-06-14 17:46:13 0 浏览量 回答数 1

问题

c++对象内存分配的问题,如何确定在堆上还是在栈上?

c++中对象内存放堆上还是在栈上是不是根据对象实例化的方法,如:A a; //在栈中分配内存A * a = new A(); //动态内存分配,在堆上要是这样,如果我尽量不用指针的话(这样程序风格似乎更加清晰一些),那是不是对象都分配到栈上...
a123456678 2019-12-01 20:08:05 1007 浏览量 回答数 1

回答

你说的从数据库读取JAVAMAIL的配置? 那意思就是运行期才动态配置JAVAMAIL了对吧, 不运行怎么访问数据库呢? 那问题就好办了, 删除你的配置, NEW 一个 JAVAMAIL 实例, 调用设置方法, 一切OK!  不用配置了, 动态运行的东西是配不出来的, 除非你自己实现一个查数据库并初始化MAIL实例的工厂类.  这样的设计失去了配置的意义.######求解! ###### 可以利用工厂方法生成一个properties, 然后把properties注入到javaMailSenderImpl. 或者利用init方法启动的时候load并初始化。###### 构建一个MailConfig的bean,在bean里加入host,username,password等必要的field,生成getter,setter方法,bean中提供一个构造方法或者其他方式,将bean初始化时,从数据库中读取配置,为field赋值。 在spring配置文件,配置该bean,用该bean替换properties,可否?######挺好的思路,安装你的思路。在spring配置文件,配置该bean,然后 <bean id="mailInfo" class="某个从数据库取得mail参数的bean类"/> 接下来。 例如 <property name="host" value="我想知道这里改怎么调用那个bean的host属性呢?" />###### 引用来自“谭明智”的答案 构建一个MailConfig的bean,在bean里加入host,username,password等必要的field,生成getter,setter方法,bean中提供一个构造方法或者其他方式,将bean初始化时,从数据库中读取配置,为field赋值。 在spring配置文件,配置该bean,用该bean替换properties,可否? @范庆辉 : 我想到有两种方法,第一种采用org.springframework.beans.factory.config.PropertyPathFactoryBean,将一个bean的属性值赋值给另一个bean的属性值。还有种方法就是继承JavaMailSenderImpl,将mailInfo这个bean作为一个它的一个属性,通过setter方法注入进去。把mailInfo的值赋值给相应的属性。 ######应该是自己写一个支持DB数据源的PlaceHolderConfigurer。最近hold一词好像比较火啊
kun坤 2020-06-06 23:52:08 0 浏览量 回答数 0

问题

关于PHP命名空间的疑惑

在编程的时候遇到这样一个关于命名空间的问题,先上代码:namespace Test { class Test {} } namespace Chou { use Test\Test; class Mee { ...
落地花开啦 2019-12-01 19:54:11 837 浏览量 回答数 1

回答

继承不会要求主类和子类的方法必须是统一的,一个类实现一个接口要求实现里面所有的方法,否则必须将这个类声明为抽象类。 关于你的问题,且看下面的demo: class app { public static function ado(){ echo 'app_do'; } } require_once "./app.php"; class model extends app{ public function model_do(){ echo "\n-------------static\n"; static::ado(); echo "\n-------------parent\n"; parent::ado(); echo "\n-------------model\n"; model::ado(); echo "\n-------------parent\n"; app::ado(); echo "\nmodel_do\n"; } } $a = new model(); $a->model_do(); 运行结果: -------------static app_do -------------parent app_do -------------model app_do -------------parent app_do model_do 希望对你有所帮助。。 ######静态方法不能调用非实例化的动态方法 。但是动态能调静态的######可以的 model::method();######static::method();
kun坤 2020-06-09 11:25:56 0 浏览量 回答数 0

问题

JAVA中的反射如何去掌握?

每个类都有一个 Class 对象,包含了与类有关的信息。当编译一个新类时,会产生一个同名的 .class 文件,该文件内容保存着 Class 对象。 类加载相当于 Class 对象的加载ÿ...
montos 2020-05-18 21:18:01 3 浏览量 回答数 1

回答

我们一般使用字面量的形式直接创建对象,但是这种创建方式对于创建大量相似对象的时候,会产生大量的重复代码。但 js 和一般的面向对象的语言不同,在 ES6 之前它没有类的概念。但是我们可以使用函数来进行模拟,从而产生出可复用的对象 创建方式,我了解到的方式有这么几种: (1)第一种是工厂模式,工厂模式的主要工作原理是用函数来封装创建对象的细节,从而通过调用函数来达到复用的目的。但是它有一个很大的问题就是创建出来的对象无法和某个类型联系起来,它只是简单的封装了复用代码,而没有建立起对象和类型间的关系。 (2)第二种是构造函数模式。js 中每一个函数都可以作为构造函数,只要一个函数是通过 new 来调用的,那么我们就可以把它称为构造函数。执行构造函数首先会创建一个对象,然后将对象的原型指向构造函数的 prototype 属性,然后将执行上下文中的 this 指向这个对象,最后再执行整个函数,如果返回值不是对象,则返回新建的对象。因为 this 的值指向了新建的对象,因此我们可以使用 this 给对象赋值。构造函数模式相对于工厂模式的优点是,所创建的对象和构造函数建立起了联系,因此我们可以通过原型来识别对象的类型。但是构造函数存在一个缺点就是,造成了不必要的函数对象的创建,因为在 js 中函数也是一个对象,因此如果对象属性中如果包含函数的话,那么每次我们都会新建一个函数对象,浪费了不必要的内存空间,因为函数是所有的实例都可以通用的。 (3)第三种模式是原型模式,因为每一个函数都有一个 prototype 属性,这个属性是一个对象,它包含了通过构造函数创建的所有实例都能共享的属性和方法。因此我们可以使用原型对象来添加公用属性和方法,从而实现代码的复用。这种方式相对于构造函数模式来说,解决了函数对象的复用问题。但是这种模式也存在一些问题,一个是没有办法通过传入参数来初始化值,另一个是如果存在一个引用类型如 Array 这样的值,那么所有的实例将共享一个对象,一个实例对引用类型值的改变会影响所有的实例。 (4)第四种模式是组合使用构造函数模式和原型模式,这是创建自定义类型的最常见方式。因为构造函数模式和原型模式分开使用都存在一些问题,因此我们可以组合使用这两种模式,通过构造函数来初始化对象的属性,通过原型对象来实现函数方法的复用。这种方法很好的解决了两种模式单独使用时的缺点,但是有一点不足的就是,因为使用了两种不同的模式,所以对于代码的封装性不够好。 (5)第五种模式是动态原型模式,这一种模式将原型方法赋值的创建过程移动到了构造函数的内部,通过对属性是否存在的判断,可以实现仅在第一次调用函数时对原型对象赋值一次的效果。这一种方式很好地对上面的混合模式进行了封装。 (6)第六种模式是寄生构造函数模式,这一种模式和工厂模式的实现基本相同,我对这个模式的理解是,它主要是基于一个已有的类型,在实例化时对实例化的对象进行扩展。这样既不用修改原来的构造函数,也达到了扩展对象的目的。它的一个缺点和工厂模式一样,无法实现对象的识别。 嗯我目前了解到的就是这么几种方式。
剑曼红尘 2020-04-03 15:14:03 0 浏览量 回答数 0

问题

java为什么画出的小球不能动问题

public class New01 { public New01()//定义主类DrawFrame { Frame f=new Frame("my app");//建立框架 GamePanel mp=new GamePanel();//建...
蛮大人123 2019-12-01 19:53:22 1178 浏览量 回答数 1

回答

您显示的两个片段都不是惯用的现代C ++代码。 newand delete(and new[]和delete[])在C ++中不被弃用,也永远不会。它们仍然是实例化动态分配对象的方法。但是,由于您必须始终将a new与delete(以及a new[]与delete[])进行匹配,因此最好将它们保存在(库)类中,以确保为您提供帮助。请参阅C ++程序员为什么要尽量减少使用“ new”?。 您的第一个代码段使用“裸” new[],然后从不delete[]创建数组。那是个问题。std::vector在这里您需要的一切都很好。它将使用某种形式的new幕后花样(我将不深入介绍实现细节),但是您需要关心的是,它是一个动态数组,但更好,更安全。 第二个片段使用“可变长度数组”(VLA),这是一些编译器还允许在C ++中作为扩展使用的C功能。与newVLA 不同,VLA本质上是在堆栈上分配的(资源非常有限)。但更重要的是,它们不是标准的C ++功能,应避免使用,因为它们不可移植。它们当然不能代替动态(即堆)分配。
保持可爱mmm 2020-02-09 14:08:37 0 浏览量 回答数 0

回答

w1-w8先放到map里,以w+i为键,然后循环的时候以此键get到对象 ######回这个我认为不能用反射,因为这个带参数了######都已经放map 里了,何不直接写上。。。。。add.....,不科学######如果不会反射的话,这的确是个很好的办法,类似于枚举,但是如果是w100,w1000的话,要手写很多代码######用反射######回复 @kkn1x : 自己搜索一下嘛,CLass.forName()会用了,基本反射就会用了######具体?######为何不考虑把参数做成一个组。。######没有参数!!###### 如果是w1~w8是类的一些属性的话,Java使用反射能达到目的 如果是临时变量,这个解释型语言倒是很常见,如javascript,但是在Java里面,用动态编译的话,可能达到目的 ######具体用反射怎吗做?????????######Wall是一个类名,w1。。。。是实例化对象######用google提供的工具类吧。
爱吃鱼的程序员 2020-06-04 16:21:40 0 浏览量 回答数 0

问题

dubbo 的 spi 思想是什么?【Java问答学堂】50期

面试题 dubbo 的 spi 思想是什么? 面试官心理分析 继续深入问呗,前面一些基础性的东西问完了,确定你应该都 ok,了解 dubbo 的一些基本东西,那么问...
剑曼红尘 2020-07-07 09:48:29 25 浏览量 回答数 1

问题

词汇表是什么样的?(S-V)

S A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z SASL ...
轩墨 2019-12-01 22:06:08 2089 浏览量 回答数 0

问题

使用 ASM 实现 Java 语言的“多重继承”:报错

简介: 尽管大部分情况下我们并不需要多重继承,但总有一些情况下我们不得不做出多重继承的考虑。但又由于 Java 语言本身不支持多重继承,这就会带来问题。本文试图使用 ASM 来解决这一问题。 ...
kun坤 2020-06-06 15:29:41 0 浏览量 回答数 1

回答

UIView控件只是一个矩形的空白区域,并没有任何内容。iOS应用的其他UI控件都继承了UIView,这些UI控件都是在UIView提供的空白区域上绘制外观。 基于UI控件的实现原理,开发者完全可以开发出项目定制的控件——当iOS系统提供的UI控件不足以满足项目需要时,开发者可以通过继承UIView来派生自定义控件。 当开发者打算派生自己的UI控件时,首先定义一个继承View基类的子类,然后重写View类的一个或多个方法,通常可以被用户重写的方法如下。 Ø initWithFrame::前面已经见到,程序创建UI控件时常常会调用该方法执行初始化,因此,如果你需要对UI控件执行一些额外的初始化,即可通过重写该方法来实现。 Ø initWithCoder::程序通过在nib文件中加载完该控件后会自动调用该方法。因此,如果程序需要在nib文件中加载该控件后执行自定义初始化,则可通过重写该方法来实现。 Ø drawRect::如果程序需要自行绘制该控件的内容,则可通过重写该方法来实现。 Ø layoutSubviews:如果程序需要对该控件所包含的子控件布局进行更精确的控制,可通过重写该方法来实现。 Ø didAddSubview::当该控件添加子控件完成时,将会激发该方法。 Ø willRemoveSubview::当该控件将要删除子控件时,将会激发该方法。 Ø willMoveToSuperview::当该控件将要添加到其父控件中时,将会激发该方法。 Ø didMoveToSuperview:当把该控件添加到父控件完成时,将会激发该方法。 Ø willMoveToWindow: :当该控件将要添加到窗口中时,将会激发该方法。 Ø didMoveToWindow:当把该控件添加到窗口完成时,将会激发该方法。 Ø touchesBegan:withEvent::当用户手指开始触碰该控件时,将会激发该方法。 Ø touchesMoved:withEvent::当用户手指在该控件上移动时,将会激发该方法。 Ø touchesEnded:withEvent::当用户手指结束触碰该控件时,将会激发该方法。 Ø touchesCancelled:withEvent::用户取消触碰该控件时,将会激发该方法。 当需要开发自定义View时,开发者并不需要重写上面列出的所有方法,而是根据业务需要重写上面的部分方法。例如,下面的跟随手指运动的小球示例程序就只重写drawRect:方法。 实例:跟随手指运动的小球 为了实现一个跟随手指运动的小球示例,我们考虑开发自定义的UI控件,这个UI控件将会在指定位置绘制一个小球,这个位置可以动态改变。当用户通过手指在屏幕上拖动时,程序监听到这个手指动作,并把手指动作的位置传入自定义UI控件,然后通知该控件重绘即可。 首先创建一个Single View Application,然后通过该应用的项目导航面板打开Main.storyboard文件,选中Dock区内唯一场景内的View Controller节点,或选中界面布局文件中的根UI控件:UIView(也就是界面中大块的、右上角有个电池图标的白色矩形区域),然后按下键盘上的command+option+3快捷键,打开Xcode的身份检查器,通过身份检查器可以看到该界面布局文件的根UI控件的实现类是UIView,如图9.38所示。 该应用并不打算使用默认的UIView作为根控件,因此将图9.38所示对话框中Class文本框内的实现类改为FKCustomView,这表明程序将使用FKCustomView作为界面设计的根控件。 接下来程序需要开发自定义的FKCustomView类,其步骤如下。 ①用鼠标右键单击项目文件夹,然后单击“New File”菜单项,Xcode弹出如图9.39所示的对话框。
杨冬芳 2019-12-02 03:01:21 0 浏览量 回答数 0

回答

在K8S运行的服务,从简单到复杂可以分成三类:无状态服务、普通有状态服务和有状态集群服务。下面分别来看K8S是如何运行这三类服务的。 无状态服务,K8S使用RC(或更新的Replica Set)来保证一个服务的实例数量,如果说某个Pod实例由于某种原因Crash了,RC会立刻用这个Pod的模版新启一个Pod来替代它,由于是无状态的服务,新启的Pod与原来健康状态下的Pod一模一样。在Pod被重建后它的IP地址可能发生变化,为了对外提供一个稳定的访问接口,K8S引入了Service的概念。一个Service后面可以挂多个Pod,实现服务的高可用。 普通有状态服务,和无状态服务相比,它多了状态保存的需求。Kubernetes提供了以Volume和Persistent Volume为基础的存储系统,可以实现服务的状态保存。 有状态集群服务,与普通有状态服务相比,它多了集群管理的需求。K8S为此开发了一套以Pet Set为核心的全新特性,方便了有状态集群服务在K8S上的部署和管理。具体来说是通过Init Container来做集群的初始化工作,用Headless Service来维持集群成员的稳定关系,用动态存储供给来方便集群扩容,最后用Pet Set来综合管理整个集群。 要运行有状态集群服务要解决的问题有两个,一个是状态保存,另一个是集群管理。我们先来看如何解决第一个问题:状态保存。Kubernetes有一套以Volume插件为基础的存储系统,通过这套存储系统可以实现应用和服务的状态保存。 K8S的存储系统从基础到高级又大致分为三个层次:普通Volume,Persistent Volume和动态存储供应。 1.普通Volume 最简单的普通Volume是单节点Volume。它和Docker的存储卷类似,使用的是Pod所在K8S节点的本地目录。 第二种类型是跨节点存储卷,这种存储卷不和某个具体的K8S节点绑定,而是独立于K8S节点存在的,整个存储集群和K8S集群是两个集群,相互独立。 跨节点的存储卷在Kubernetes上用的比较多,如果已有的存储不能满足要求,还可以开发自己的Volume插件,只需要实现Volume.go里定义的接口。如果你是一个存储厂商,想要自己的存储支持Kubernetes上运行的容器,就可以去开发一个自己的Volume插件。 2.persistent volume 它和普通Volume的区别是什么呢? 普通Volume和使用它的Pod之间是一种静态绑定关系,在定义Pod的文件里,同时定义了它使用的Volume。Volume是Pod的附属品,我们无法单独创建一个Volume,因为它不是一个独立的K8S资源对象。 而Persistent Volume简称PV是一个K8S资源对象,所以我们可以单独创建一个PV。它不和Pod直接发生关系,而是通过Persistent Volume Claim,简称PVC来实现动态绑定。Pod定义里指定的是PVC,然后PVC会根据Pod的要求去自动绑定合适的PV给Pod使用。 答案来源网络,供参考,希望对您有帮助
问问小秘 2019-12-02 03:01:06 0 浏览量 回答数 0
阿里云企业服务平台 陈四清的老板信息查询 上海奇点人才服务相关的云产品 爱迪商标注册信息 安徽华轩堂药业的公司信息查询 小程序定制 上海微企信息技术相关的云产品 国内短信套餐包 ECS云服务器安全配置相关的云产品 天籁阁商标注册信息 开发者问答 阿里云建站 自然场景识别相关的云产品 万网 小程序开发制作 视频内容分析 视频集锦 代理记账服务 北京芙蓉天下的公司信息查询